繁体   English   中英

在使用转换构造函数编译代码时,为什么需要const复制构造函数?

[英]Why do I need const copy constructor when compiling my code with converting constructor?

啊,我有这样的课:

class A {
public:
    A(int *object) {
        std::cout << "convert";
    }

    A(A &object) {
        std::cout << "copy";
    }
};

main.cpp中

A a = new int;

然后,当我试图编译它时,我得到了

从'A'类型的右值开始无效初始化类型'A&'的非const引用

但是当我像这样向复制构造函数添加const时:

A(const A &object) {
    std::cout << "copy";
}

代码编译和“转换”被调用。 它也适用于我删除复制构造函数。 为什么会这样呢? 我虽然这个例子与复制构造函数无关,因为我们不使用类A的实例来创建另一个。

因为代码的工作方式如下(前C ++ 17):

A a(A(new int));

注意,A的复制构造函数被调用,其中临时对象由于A(new int) 并且您不能将非const左值引用绑定到临时值。

请注意,在C ++ 17中,由于保证了copy-elision,这段代码将被编译(在C ++ 17的情况下,这段代码在语义上等同于A a(new int) 。你也看不到copy打印(因为复制省略不会被调用

A a = new int; 是复制初始化。 它采用右侧的内容并使用它来初始化左侧的内容作为副本。 因为new int不是A所以编译器会调用转换构造函数。 临时不能绑定到非const引用,因此您会收到错误。 当您添加const您现在可以将临时绑定到它,它将起作用。 删除复制构造函数也可以,因为编译器将为您提供一个,并且它在const引用中提供一个,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM