此代码在VS2010中发出error C2248: 'A::A' : cannot access private member declared in class 'A'
,但RVO不需要复制构造函数。为了证明这一点,只需将下面的声明A(const A&);
公开,即使没有复制构造函数的定义,代码也会毫无问题地执行。
class A
{
int i;
A(const A&);
public:
A() : i(1) {}
};
A f() { return A(); }
int main()
{
A a;
a = f();
}
答案 0 :(得分:3)
仅仅因为你的程序最终没有真正调用复制构造函数并不意味着它可以省略它。声明但不定义它只是通过在编译期间使函数可用而“欺骗”编译器而不是在链接期间可用,因此一旦对其调用进行了优化,一切都“有效”。但是RVO是对性能的优化,并且必须编写程序,使其在没有RVO的情况下正确。