我试图弄清楚 RVO 和 NRVO 如何与新的 C++11 移动运算符一起工作。我用几个例子起草了一个虚拟课程。
编辑:只显示代码的最重要部分。
完整的源代码可在此处获得。
我有两个函数将类作为引用并返回值或引用:
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
当使用左值引用时,不会调用复制构造函数。否则,那些函数(接收引用作为参数)仍然调用复制构造函数。
此功能编译器是否依赖?难道我做错了什么?