c++ - RVO 和 NRVO 优化 + C++11 move 运算符

标签 c++ c++11 move-semantics rvo nrvo

我正在尝试弄清楚 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/

相关文章:

c++ - 在windows平台下,比如xp,win7,有没有redis的好用的C++客户端?

C++ - 导出 C++ 库公共(public)部分的正确方法

c++ - C++11 自动类型危险吗?

c++ - 从 C++ 连接 mysql 时出现编译错误

C++11:函数指针表、Lambdas

c++ - 无法分配给 const 成员函数中的非静态数据成员

c++ - 按值传递然后移动构造还是按引用传递然后复制构造更好

c++ - 当之后仍需要使用源对象时,调用父级 move 分配运算符

c++ - 包含仅 move 类型的类的构造函数应该通过引用还是通过右值引用接收仅 move 类型?

c++ - 具有抑制 move 构造函数/分配的类型如何仍被视为可 move 的?