7

为什么 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 版本(在线)

http://ideone.com/ustDRj

4

2 回答 2

5

X x = 1;复制初始化的语法。如果初始化程序不是类型X(如此处),这在语义上等价于:

X x(X(1));

也就是说,它构造了一个Xfrom argument1的实例,然后x从该实例复制初始化。

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

于 2013-10-24T09:44:18.177 回答
2

您正在尝试在此处为调用复制构造函数的类对象初始化一个值。

int main()
{
    X x = 1; 
}

将代码更改为

X x(1);
于 2013-10-24T09:43:54.360 回答