尽管RVO不需要复制构造函数,但此代码在VS2010中发出error C2248: 'A::A' : cannot access private member declared in class 'A'。为了证明这一点,只需将下面的声明A(const A&);公开,即使没有copy构造函数的定义,代码也可以毫无问题地执行。

class A
{
    int i;
    A(const A&);

    public:
    A() : i(1) {}

};

A f() { return A(); }

int main()
{
    A a;
    a = f();
}

最佳答案

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

关于c++ - 当下面的代码中复制构造函数为私有(private)时,为什么会出现错误C2248?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15972478/

10-11 22:25
查看更多