C++隐式转换构造函数调用

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版本上也是一样的(在线)

http://ideone.com/ustDRj

Rei*_*ica 5

X x = 1;复制初始化的语法.如果初始化器不是类型X(如此处),则在语义上等效于:

X x(X(1));
Run Code Online (Sandbox Code Playgroud)

也就是说,它构造了Xfrom参数的insance 1,然后x从该实例复制初始化.

就像任何其他副本初始化一样,可以省略副本.这可能发生在您的情况下,因此实际上不会调用复制构造函数.仍然,(再次,就像任何其他复制省略一样),它必须是可用的.

  • @axe这是由于`T t(x)`和`T t = x;`的语义不同.在[这里](http://www.gotw.ca/gotw/036.htm)上查看更多信息. (2认同)