다음 코드를 고려하십시오.
class MyClass
{
MyClass()
{
x = 0;
}
MyClass(const MyClass&)
{
x = 1;
}
public:
int x;
MyClass(MyClass&&)
{
x = 2;
}
static const MyClass f()
{
return MyClass();
}
};
int main()
{
const MyClass& p = MyClass::f();
return 0;
}
이 코드는 VC ++ 2010에서 컴파일되지 않습니다.
error C2248: 'MyClass::MyClass: cannot access private member declared in class 'MyClass'
나는 그것이 RVO와 관련이 있다고 생각하지만 그것이 무엇을하고 있는지 더 잘 이해하고 싶습니다. 복사 생성자를 호출해야 할 이유가 없습니다.
내가 기대하는 것은 다음과 같습니다.
실제로 복사 생성자를 공개하면 정확히 컴파일되고 작동합니다. 복사 생성자는 호출되지 않습니다. x의 최종 값은 0입니다.
이것은 C ++ 03 규칙과 관련이 있습니다. C ++ 03에서 처음에 임시를 참조에 할당하면 임시를 복사 할 수 있습니다 .
C ++ 11부터는 해당 동작이 사라지고 더 이상 복사가 수행되지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다