c++ - 为什么删除移动构造函数会导致编译错误?
问题描述
以下代码可以正常工作:
#include <iostream>
using namespace std;
struct oops
{
~oops()
{
cout << " oops! " << endl;
}
};
struct sample
{
oops* x = nullptr;
sample(oops* p) : x(p)
{
cout << "sample: " << p << endl;
}
~sample()
{
delete x;
cout << "destroy sample " << endl;
}
sample(const sample&)
{
cout << "copy sample " << endl;
}
sample(sample&&)
{
cout << "move sample " << endl;
}
};
int main()
{
sample s = new oops;
return 0;
}
结果:
sample: 0x1470c20
oops!
destroy sample
它清楚地表明,既没有调用移动构造函数,也没有调用复制构造函数。当这些构造函数被删除时,
sample(const sample&) = delete;
sample(sample&&) = delete;
gcc 给出编译错误:
bpp.cpp: In function ‘int main()’:
bpp.cpp:29:17: error: use of deleted function ‘sample::sample(sample&&)’
sample s = new oops;
^
bpp.cpp:24:2: note: declared here
sample(sample&&) = delete;
^
bpp.cpp:14:2: note: after user-defined conversion: sample::sample(oops*)
sample(oops* p) : x(p)
^
这有关系-fno-elide-constructors
吗?如何在不定义这些构造函数或使用显式构造函数的情况下编译它?
编辑:我的 GCC 版本是 5.4.0。命令是:
g++ bpp.cpp -std=c++17
解决方案
推荐阅读
- jquery - 如果选中所有子复选框,则选中父复选框
- java - 运行 loadjava 时 AIX 服务器出错:未找到
- apache-spark - spark kryo 注册泛型类
- apache-spark - 比较两个数据集并获取更改了哪些字段
- react-native - 自定义事件以检查反应原生 mapbox gl 地图中是否缺少样式图像
- flutter - 平台特定代码错误:MissingPluginException
- android - 从最小化应用程序列表中删除应用程序时如何保持服务运行?
- c# - ASP.NET Core Hangfire 生产部署
- javascript - 如何在 TS 中运行命令?
- excel - Excel VBA:WorksheetChange,每当单元格更改时,它都会编辑一个 CSV 文件