2011-04-08 7 views
6

이 rvalue 호출이 모호한 이유는 무엇입니까? 나는 AA와 AA를 가질 수 & 그리고 컴파일러는 AA&을 사용하는 것을 알게 될 것이다. 하지만 세 번째 옵션을 추가 할 때 오류가 발생합니다. 분명히 AA & &은 더 나은 과부하이며, int의 int와 같은 다른 것은 더 길다. 왜 이것이 모호한가요? 3 가지 과부하를 모두 지킬 수있는 방법이 있습니까? (타입 캐스팅 (AA&&)하지 않습니다).이 rvalue 호출이 모호한 이유는 무엇입니까?

struct AA{ 
    void*this_; 
    AA() { this_=this; } 
    //not valid, use AA&, AA(AA a){ this_=this; } 
    AA(AA&a){ this_=this; } 
    AA(AA&&a){ this_=a.this_; } 
}; 
void movetest(AA s) {} 
void movetest(AA& s) {} 
//This gets me the ambiguous error void movetest(AA&& s) {} 
AA&& movetest() { return AA(); } 
void MyTestCode2(){ 
    AA a; 
    AA b(a); 
    AA c = movetest(); 
    movetest(AA()); 
} 
+2

(보조 노트에, 당신의 제로 인수에 대응'movetest' 함수는 지역 변수에 대한 참조를 반환합니다.) – GManNickG

+0

(나는 또한거야 정상적으로 당신은 3 가지 과부하 모두를 원하지 않는다고 말하십시오.) – GManNickG

+0

@GMan : 왜 ... 왜? 응? 아마 이것도 설명 할 수 있습니다 http://stackoverflow.com/questions/5591995/is-move-by-lvalue-broken-unfinished-in-msvc2010 –

답변

6

나는 AA를 사용하는 알 AA와 AA & 컴파일러 을 가질 수 &

예, movetest (AA())의 경우;, movetest (AA)은 실행 가능합니다. non-const에 대한 (lvalue) 참조가 rvalue에 바인딩 될 수 없기 때문입니다. 그러나 우변 참조는 이라고 직접적으로에 바인딩됩니다. AA & & AA 암시 적 변환 시퀀스AA로 변환하기 위해 사용했기 때문에, 과부하 해상도 목적 함수

void movetest(AA) void movetest(AA&&) 

가 동일()에 각각 동일하다. 직접 참조 바인딩은 ID 변환으로 간주되기 때문에 전자는 더 좋지 않습니다.

+0

기본적으로 규칙에 따라 값으로 매개 변수를 사용하는 함수가 있다면 다른 과부하가 없어야합니까? – Clinton

1

decltype과 일치합니다. 이것은 이것보다 정말 다르지 않다 C++ 03/98 모호성 :

struct AA {}; 

void movetest(AA s) {} 
void movetest(AA& s) {} 

int main() 
{ 
    AA a; 
    movetest(a); 
} 

test.cpp:9:5: error: call to 'movetest' is ambiguous 
    movetest(a); 
    ^~~~~~~~ 
test.cpp:3:6: note: candidate function 
void movetest(AA s) {} 
    ^
test.cpp:4:6: note: candidate function 
void movetest(AA& s) {} 
    ^
1 error generated.