【发布时间】:2013-11-02 22:46:48
【问题描述】:
为什么 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()
这是错误吗?有什么解决办法吗?
我本地 PC 上的 gcc 版本是 4.6.3,这在另一个 gcc 版本(在线)上也是如此
【问题讨论】:
-
这不是bug,它被称为copy elision。在某些情况下,允许编译器省略副本。它仍然要求复制构造函数可用。
标签: c++ gcc constructor copy-constructor implicit-conversion