![](/img/trans.png)
[英]do i need copy constructor ? and how copy const object to non const object using copy constructor
[英]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.