2011-04-08 4 views
1

이 코드가 작동하지 않는 이유를 모르겠습니다. 이 _는 0xcccccccc로 표시되고 v는 더 이상 4가 아닙니다. 왜?msvc2010에서 lvalue로 이동/중단되지 않습니까?

참고 : lvalue/move 의미를 사용하려고합니다.

struct AA{ 
    void*this_; 
    int v; 
    AA() {v=4;this_=this; } 
    AA(AA&a){this_=this; } 
    AA(AA&&a){ 
     this_=a.this_; 
     v = a.v; 
    } 
}; 
void movetest(AA s) {} 
void movetest(AA& s) {} 
//void movetest(AA&& s) {} 
AA&& movetest() { return AA(); } 
void MyTestCode2(){ 
    AA c = movetest(); 
    printf("wron value. 4 !='%d'\n", c.v); 
} 

답변

3

로컬로의 참조를 반환합니다. 그것은이 코드는 하나 이동이 필요하거나 존재하는 생성자를 복사

AA movetest() { return AA(); } 

해야하지만, MSVC는 반환 값 최적화를 사용하여 실제로 중 하나를 호출하지 않습니다. 일반적으로 객체의 디자인은 객체의 일관된 상태를 유지하면서 부작용에 의존하지 말고 이동이나 복사가 컨트롤 외부에서 발생하는 것처럼 구현해야합니다.

VC2010 제대로 디버그 빌드에 예를 들어,

AA의 movetest() { AA을 복사 이동을 선호한다; return a; }

은 AA (AA & &) 생성자가 아닌 AA (AA &)를 호출합니다.

+0

그 솔루션을, AA의 &&가 호출되지 않습니다. 필자는'a = a.v + 1'을 작성하여 테스트하여 로그에 5를 인쇄해야합니다.하지만 어쨌든 어떻게 함수에서 lvalue를 사용합니까? –

+1

std :: move로 이동 구성을 강제로 보여주는 내 대답을 편집했습니다. – BCoates

+0

AA && 캐스트 또는 표준 : : 이동 (캐스팅하지만 참조 제거 후)을 사용해야합니다. return AA()는 최적화 된 것 같습니다 (이것은 디버그 모드입니다). 그것은 복사 생성자를 호출하지 않습니다. 만약 내가 금주 모임을 쓸 것이다; a. 그래서 ... 나는 (왜 적어도 Visual C++로) AA && isnt 에러/경고가 무엇인지 이해할 수 없다. +1 및 accepeted –

1

추가 정보 : 이것은 서식 관련 문제로 인한 의견이 아니라 대답입니다.

경고는 좋지만 언어에서는 필요하지 않습니다. AA &으로 현지 좌변 치를 반환하고 경고가 표시되는지 확인하십시오.

그 소리가 ++ 코드에 대한 다음과 같은 경고 제공 :

test.cpp:14:26: warning: returning reference to local temporary object 
AA&& movetest() { return AA(); } 
         ^~~~ 
관련 문제