C++ 类类型复制初始化

标签 c++

如果我写

T t = T();

T 是一个类。

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

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

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

T t;

T t = T();

因为编码规则检查程序。

碰巧 T 类是不可复制的,并且有一个私有(private)的复制构造函数和复制赋值运算符...... 所以我希望看到编译器在这种情况下总是有效地摆脱拷贝。

编辑: 我被一些奇怪的东西误导了: noncompyable 类实际上继承自 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;
}

下面的不是:

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

int main( void )
{
    A a = A();
    return 0;
}

最佳答案

构造一个临时变量然后将构造复制到 t,而不是复制分配它 (8.5/14)。

复制构造函数可以省略,但无论如何都必须可以访问 (12.8/14-15)

关于C++ 类类型复制初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6523624/

相关文章:

c++ - 如何使用 std::filesystem 跳过/忽略名称使用宽字符的文件?

c++ - C++ 库中的快速梯度下降实现?

c++ - 随机函数 C++ 的种子值

c++ - 从前序遍历迭代构建二叉搜索树(非递归)

C++ 复制构造函数 : attempting to reference a deleted function

c++ - 装饰器模式 - 我如何在初始化时不调用复制构造函数?

c++ - GDBusProxy - 在就绪回调中获取输入参数

c++ - 目前在 Ubuntu C/C++ 中如何将 IANA 时区名称转换为 UTC 偏移量

c++ - 绘制的自定义项目有时会在 QGraphicsScene 中被砍掉

c++ - 在 C++ 中重写 = 运算符