:함수에서 명명되지 않은 객체를 반환합니다. RVO가 아직 시작되는 이유는 무엇입니까? 이에 대해
:그러나 나는 GCC와 약간의 테스트를했다 "는 표현이 경우에 따라서 return 문 복사 생략 만 지역 변수의 이름 발생할 수 있습니다"Why does std::move prevent RVO? 사람이 썼다
class X
{
public:
X()
{
cout << "def" << endl;
}
X(const X& x)
{
cout << "copy" << endl;
}
X(X&& x)
{
cout << "move" << endl;
}
};
X produceX()
{
return X();
}
int main()
{
X x{produceX()};
return 0;
}
produceX 함수는 명명 된 값을 반환하지 않습니다. 이름이 지정되지 않은 임시 객체를 반환합니다. 그러나 RVO는 여전히 발 차고 카피 나 이동 건설은 없습니다. main의 x 객체는 내부에서 생성됩니다. 내가 이와 같이 produceX를 쓰면 :
X produceX()
{
X localNamedObject;
return localNamedObject;
}
예상대로 작동합니다. 그런데 왜 RVO가 허용됩니까?
C++ 표준에 따르면 허용됩니다. 변수는 * 지명되지 않습니다. 따옴표가 잘못되었거나 문맥에서 벗어났습니다. – juanchopanza
"따라서 return 문에서 복사본 elision은식이 로컬 변수의 이름 인 경우에만 발생할 수 있기 때문에"는 사실이 아닙니다. –