나는 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;
}
샘플 코드 [컴파일하지 않음] (http://coliru.stacked-crooked.com/a/a5adcbe34052d925). 어떤 컴파일러를 사용하고 있습니까? – Quentin
나는 이것을 VS2013과 VS2017에서 모두 시도했다. 둘 다 오류가 없습니다. –
정말 고마워요. 힌트 다음에 [이 하나] (https://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug)도 있습니다. 명령 옵션/Za를 사용하면 case 2와 3 오류가 발생합니다. 이 확장의 목적은 나에게 너무 신비스럽게 보인다. :/ –