我正在尝试弄清楚 RVO 和 NRVO 如何与新的 C++11 move 运算符一起工作。 我已经起草了一个带有几个示例的虚拟类。
编辑:只显示了代码中最重要的部分。
完整的源代码可用here .
我有两个函数获取类作为引用并返回值或引用:
VOpt& fChangeClassRetRef(VOpt &m) {
m.setX(21);
return m;
}
VOpt fChangeClassRetValue(VOpt &m) {
m.setX(21);
return m;
}
当我调用这些函数时,输出如下:
VOpt &m14 = fChangeClassRetRef(m13);
m14 = fChangeClassRetRef(m11);
-> Copy Assignment Operator
m14 = fChangeClassRetValue(m11);
-> Copy Constructor
-> C++11 Move Operator
当使用左值引用时,不会调用复制构造函数。否则,那些函数(接收引用作为参数)仍会调用复制构造函数。
此功能是否依赖于编译器?我做错了什么吗?
最佳答案
m14 = fChangeClassRetRef(m11);
-> Copy Assignment Operator
该函数返回一个引用(左值),它不能进行 move 赋值,因为参数不是右值。
m14 = fChangeClassRetValue(m11);
-> Copy Constructor
-> C++11 Move Operator
复制构造函数在内部被触发以创建返回值。它必须是复制构造函数而不是 move 构造函数,因为参数是引用(左值)。将返回值赋给 m14
使用 move 赋值运算符,因为参数是右值。
关于c++ - RVO 和 NRVO 优化 + C++11 move 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355683/