gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:32:41 24 4
gpt4 key购买 nike

为什么 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()

是bug吗?有什么解决方法吗?

我本地 PC 上的 gcc 版本是 4.6.3,这在另一个 gcc 版本(在线)上也以同样的方式工作

http://ideone.com/ustDRj

最佳答案

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

X x(X(1));

也就是说,它从参数 1 构造一个 X 的实例,然后从该实例复制初始化 x

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

关于C++隐式转换构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19562353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com