这是this question的跟进

在下面的代码中,为什么第1行编译而第2行和第3行不编译(使用Visual C++ 2010)

class ABase
{
protected:
    ABase() {}
    ~ABase() {}
private:
    ABase( const ABase& );
    const ABase& operator=( const ABase& );
};

class A : ABase
{
};

class B
{
public:
    B() {}
    ~B() {}
private:
    B( const B& );
    const B& operator=( const B& );
};

int main( void )
{
    A a = A(); // line 1
    A a2( a ); // line 2
    B b = B(); // line 3

    return 0;
}

(注意BA是boost::noncopyable的拷贝)

编辑:
我的问题不是想知道为什么第2行和第3行不编译(我知道复制构造函数是私有(private)的),而是为什么第1行会编译。

最佳答案

编译器在接受首次使用时是错误的。即使删除了拷贝,也必须可以访问拷贝构造函数才能使代码正确。
在这种特殊情况下,A中有一个隐式声明的拷贝构造函数:

这是隐式定义的:

关于c++ - 私有(private)拷贝构造函数/赋值运算符和拷贝初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6524185/

10-09 08:27