axe*_*axe 7 c++ gcc constructor copy-constructor implicit-conversion
为什么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&)’
Run Code Online (Sandbox Code Playgroud)
更有趣的是,如果我甚至写复制构造函数,它就不会被调用.析构函数只调用一次,因此以下代码
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;
}
Run Code Online (Sandbox Code Playgroud)
版画 ~X()
是bug吗?有没有解决方法?
我的locaL PC上的gcc版本是4.6.3,这在另一个gcc版本上也是一样的(在线)
X x = 1;是复制初始化的语法.如果初始化器不是类型X(如此处),则在语义上等效于:
X x(X(1));
Run Code Online (Sandbox Code Playgroud)
也就是说,它构造了Xfrom参数的insance 1,然后x从该实例复制初始化.
就像任何其他副本初始化一样,可以省略副本.这可能发生在您的情况下,因此实际上不会调用复制构造函数.仍然,(再次,就像任何其他复制省略一样),它必须是可用的.