作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么 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 版本(在线)上也以同样的方式工作
最佳答案
X x = 1;
是复制初始化的语法。 如果初始化程序不是X
类型(如此处),这在语义上等同于:
X x(X(1));
也就是说,它从参数 1
构造一个 X
的实例,然后从该实例复制初始化 x
。
就像任何其他拷贝初始化一样,拷贝可以省略。这可能发生在您的情况下,因此实际上并未调用复制构造函数。尽管如此,(同样,就像任何其他复制省略一样),它必须可用。
关于C++隐式转换构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19562353/
我是一名优秀的程序员,十分优秀!