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

时间:2013-10-24 09:40:46

标签: 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&)’

这里更有趣的是,如果我甚至写复制构造函数,它就不会被调用。析构函数只调用一次,因此以下代码

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

http://ideone.com/ustDRj

2 个答案:

答案 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);