c++ - 为什么在 C++11 中调用了复制构造函数而不是移动构造函数?
问题描述
这是我做的 C++ 测试。我认为会调用移动构造函数,但事实并非如此。这两种情况都不会调用移动构造。
class MyTest
{
public:
MyTest() {}
~MyTest() {}
MyTest(const MyTest& lv) {} // be called actually
MyTest(MyTest&& rv) {} // not be called actually, but i thought would
void operator=(const MyTest& lv) {
MyTest(std::move(lr)); // i thought the move constructor would be called here
}
};
int main()
{
// case1:
MyTest m1;
MyTest m2 = m1;
// case2:
MyTest m3;
MyTest m4;
m4 = m3; // move constructure will not be called either.
return 0;
}
解决方案
您的复制分配运算符
void operator=(const MyTest& lv) {
MyTest(std::move(lr));
}
有三个问题:
参数已命名
lv
,但您lr
在函数内部使用;参数
lv
是对常量MyTest
对象的引用,它不能被“移动”;和声明
MyTest(std::move(lv)); // Corrected the variable name
本身没有多大意义。
它通过右值初始化创建一个临时对象。但是由于不再使用该对象,编译器可以自由地对其进行优化,从而使赋值运算符的主体为空。
如果您查看生成的代码,您很可能会看到缺少对象创建。
推荐阅读
- javascript - 基于 Dropdown 的 React Effector 状态管理
- ios - “ld:找不到-lreact-native-webrtc的库”在ios xcode中归档产品但在模拟器上工作正常
- visual-studio-code - 有没有办法在 VSCode 中更改仅 Vue 指令的颜色?
- javascript - 为什么不能执行 audio.play(),我查看了检查元素并看到了某种未捕获的错误(承诺中)DOMexception
- python - Python selenium 在每次循环后仅更改当前 url 的一部分
- laravel - 用户使用下载加速器时下载计数器的问题
- java - 为什么我们需要 Hbase 中的列族?
- javascript - 将场景挂钩后的场景结果发送到外部端点
- node.js - 无法从谷歌云运行连接到 redis 公牛
- ios - 如何理解 Swift UIKit 中的自动布局?