为什么gcc需要复制构造函数来进行隐式转换构造函数调用?
class X
{
public:
X(int q) {}
~X()
{
std::cout << "~X()" << std::endl;
}
X(const X&) = delete;
};
X x = 1; // gives error: use of deleted function ‘X::X(const X&)’
这里更有趣的是,如果我甚至写复制构造函数,它就不会被调用。析构函数只调用一次,因此以下代码
class X
{
public:
X(int q) {}
~X()
{
std::cout << "~X()" << std::endl;
}
X(const X&)
{
std::cout << "copy ctor" << std::endl;
}
};
int main()
{
X x = 1;
}
打印~X()
是虫子吗?有没有解决方法?
我的locaL PC上的gcc版本是4.6.3,这在另一个gcc版本(在线)上的工作方式也是一样的答案 0 :(得分:5)
X x = 1;
是复制初始化的语法。如果初始化程序不是X
类型(如此处),则在语义上等效于此:
X x(X(1));
也就是说,它从参数X
构造1
的insance,然后从该实例复制初始化x
。
就像任何其他副本初始化一样,可以省略副本。这可能发生在您的情况下,因此实际上不会调用复制构造函数。仍然,(再次,就像任何其他复制省略一样),它必须是可用的。
答案 1 :(得分:2)
您正在尝试将值初始化为此处调用copy-constructor的类对象。
int main()
{
X x = 1;
}
将代码更改为
X x(1);