2017-10-10 18 views
3

나는 lvalue와 rvalue의 개념을 배우기 위해 Here을 연습하고 있습니다.rvalue의 주소를 사용할 수 있습니까?

그러나 다음과 같이 자신의 예제를 고안하면 VS2017을 사용하여 오류없이 컴파일되고 실행됩니다. 나는 사례 1에서 전화 한 것과 동일하다는 것을 배웠다.

produceA(10).operator=(A()) 

따라서 합법적이다. 그러나 나는 아직도 케이스 2와 3이 허용되는 이유를 이해하지 못합니다. 사실, 사례 2는 심지어 기사에서 주어진 예와 모순이된다. 이 2 가지 경우에 실제로 rvalues ​​주소를 얻고 있습니까? 그들은 정의되지 않은 행동으로 인도합니까?

#include <string> 

class A 
{ 
    int data = 1; 
public: 
    A() = default; 

    A(int in) 
    : data(in) 
    {} 

    A& operator=(const A& rhs) 
    { 
     data = rhs.data; 
     return *this; 
    } 
}; 

A produceA(int i) 
{ 
    A a(i); 
    return a; 
} 


int main() 
{ 
    // case 1 
    produceA(10) = A(); 

    // case 2 
    A* pa = &produceA(10); // rvalue? 

    // case 3 
    std::string* pstr = &std::string("Temp"); // rvalue? 

    return 0; 
} 
+0

샘플 코드 [컴파일하지 않음] (http://coliru.stacked-crooked.com/a/a5adcbe34052d925). 어떤 컴파일러를 사용하고 있습니까? – Quentin

+0

나는 이것을 VS2013과 VS2017에서 모두 시도했다. 둘 다 오류가 없습니다. –

+0

정말 고마워요. 힌트 다음에 [이 하나] (https://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug)도 있습니다. 명령 옵션/Za를 사용하면 case 2와 3 오류가 발생합니다. 이 확장의 목적은 나에게 너무 신비스럽게 보인다. :/ –

답변

0

&produceA(10) 유형 A의 익명 임시의 주소 다시 함수로부터 반환됩니다. 포인터를 설정할 수는 있지만 그 포인터는 전체 명령문의 수명 동안 만 유효합니다.

동일하게는 &std::string("Temp"); 다시 말하지만, 이것은 익명 임시 주소입니다.

+0

하지만 ... 임시 주소를 사용할 수 없습니다 : /'오류 : 임시 개체 유형 'A'의 주소 [임시 주소]' – Quentin