什么是参考Rvalue参考?

时间:2017-05-17 12:50:53

标签: c++ c++11 rvalue-reference

我正在玩这个例子来理解右值参考:

#include <string>
#include <iostream>
#include <utility>
#include <vector>

class Dog
{
public:
    Dog() {};
    Dog(Dog&& a) {  std::cout << "R value" << std::endl;}
};

Dog foo()
{
    return Dog();
}

int main()
{
    std::vector<Dog> v;
    v.push_back(Dog()); // calls move constructor

    Dog c((Dog())); // does not call move constructor
    Dog d(foo()); // does not call move constructor
}

我很难理解为什么在行v.push_back(Dog())中,对象Dog()被视为Rvalue(因此调用移动构造函数),但以下两行不调用移动构造函数。我想我可能会误解匿名对象和RValue之间的关系。

1 个答案:

答案 0 :(得分:5)

这是因为Return Value Optimization。您的编译器足够聪明,可以看到最后两行可以简化为:

Dog c;
Dog d;

因此,只允许将代码重写为上面的代码。由于push_back不符合允许使用RVO的要求,因此会创建一个临时用户,并在您目睹时简单地移动。尝试将打印添加到构造函数中,它会变得更清晰。