0

此代码error C2248: 'A::A' : cannot access private member declared in class 'A'在 VS2010 中发出,尽管 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();
}
4

1 回答 1

3

仅仅因为您的程序最终没有实际调用复制构造函数并不意味着可以省略它。声明但不定义它只是通过在编译期间而不是在链接期间使函数可用来“欺骗”编译器,因此一旦优化了对它的调用,一切都“正常工作”。但是 RVO 是对性能的优化,您的程序必须编写成在没有 RVO 的情况下它是正确的。

于 2013-04-12T13:53:30.420 回答