默认移动构造函数 Visual Studio 2015
Default move constructor Visual Studio 2015
关于Visual Studio 2015是否支持生成默认移动构造函数,似乎存在相互矛盾的文档。
这个链接和这个链接似乎说不,而这个链接说是。
我尝试了一些简单的事情:
class Test {
public:
Test(int data) : data(data) {}
Test(Test&& other) = default;
Test(Test& other) = delete;
int data;
};
int main() {
Test c(3);
std::cout << c.data << std::endl;
Test b(std::move(c));
std::cout << b.data << std::endl;
}
它按预期打印出 3 和 3。我是否犯了错误,或者实际生成了默认移动构造函数?
编辑:删除了"隐含"措辞
正在生成移动构造函数。碰巧移动int
是通过复制来实现的(将"移动"对象设置为其他值比保持原样更昂贵。
您可以通过使用详细可移动类型而不是 int
来测试这一点。
你说的两个链接告诉你"不"就是告诉你"是"。
Visual Studio 2015 支持 default
和 deleted
函数。我认为在第二个环节中已经非常清楚地说明了这一点。
C++使用"默认"一词的方式存在一点潜在的混淆。
在大多数情况下,我们理解要求默认值是为了得到你本来会得到的东西 - 没什么特别的。
但在这种情况下,它实际上意味着"重新引入默认实现"。
那是:
Test(Test&& other) = default;
并不意味着"对移动构造函数执行默认操作,该构造函数根据类的其他功能提供或不提供它"。
这意味着"提供移动构造函数的默认实现,即使它不会(默认情况下)基于类的其他功能提供"。
将=
解读为"将其分配给其默认实现"而不是"在此处执行默认操作"。
我希望这有所帮助。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- Qt Visual Studio 2015 加载项编译问题
- 包含在 <WinSock2> Visual Studio 2015 中时出现错误
- 在 Windows 10 上的 Visual Studio 2015 中使用 _open 和 _setmode
- 如何在不进入 Visual Studio 2015 中的外部库的情况下单步执行我的代码 (F11)
- c++ Visual Studio 2015 快捷方式,用于从选择代码中生成功能
- Visual Studio 2015资源视图和资源编译器使用不同的方法在项目目录中查找图标文件.如何修复
- Visual Studio 2015 中的调试速度很慢 -- 无法关闭页面堆?
- 安装 SFML 后 Visual Studio 2015 中出现错误
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- Visual Studio 2015 安装问题
- 迁移到 Visual Studio 2015 时 ATL 不起作用
- Qt5.9.1 和 Visual Studio 2015 添加了 Qt WebEngine 模块
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- CMake 和 Visual Studio 2015 - C 编译器 cl.exe 无法编译简单的测试程序
- 如何在 Linux 中运行 Visual Studio 2015 托管 c++ 测试函数?
- Visual Studio 2015:在远程编译(在Raspberry上)和本地编译(在Windows上)之间切换
- 如何调试Visual Studio 2015中的现有C 源代码
- Visual Studio 2015更新3 -C 编译器错误
- 包括DLL中的OpenVDB;将错误与Visual Studio 2015联系起来