小编fok*_*oke的帖子

私有拷贝构造函数/赋值运算符和复制初始化

这是这个问题的后续内容

在下面的代码中,为什么第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; …
Run Code Online (Sandbox Code Playgroud)

c++ boost

8
推荐指数
2
解决办法
8829
查看次数

C++类类型的复制初始化

如果我写

T t = T();
Run Code Online (Sandbox Code Playgroud)

T是一个班级.

我认为这是调用T的默认构造函数,然后是复制赋值运算符.但是允许编译器去除赋值.

我试图找到用C++标准编写的这种行为的描述,但我找不到它.你能指出我在标准中的正确位置吗?

我问这个是因为我被要求更换这个:

T t;
Run Code Online (Sandbox Code Playgroud)

T t = T();
Run Code Online (Sandbox Code Playgroud)

因为编码规则检查程序.

并且它发生了T类是不可复制的并且具有私有拷贝构造函数和拷贝赋值运算符......所以我想看到编译器在这种情况下实际上总是去掉副本.

编辑: 我被一些奇怪的东西误导了:非compyable类实际上是从boost :: noncopyable继承的,在这种情况下它会编译.但是如果我将复制构造函数和复制赋值运算符声明为private,则它不会编译.为例.这编译:

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

class A : BA
{
};

int main( void )
{
    A a = A();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下不是:

class A
{
public:
    A() {}
    ~A() {}
private:
    A( const A& );
    const A& operator=( const A& ); …
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
373
查看次数

标签 统计

c++ ×2

boost ×1