c++ - 什么时候引用是右值引用?

标签 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 之间的关系。

最佳答案

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

Dog c;
Dog d;

所以只允许将您的代码重写为上面的代码。由于 push_back 不满足允许 RVO 的要求,因此创建了一个临时文件并像您所看到的那样简单地移动了。尝试向构造函数添加打印,它会变得更清晰。

关于c++ - 什么时候引用是右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025400/

相关文章:

c++ - 根据析构函数和 move 构造函数实现 move 赋值

C++11 - 区分右值指针

c++ - shared_ptr的 setter 功能

c++ - MySQL C++ 编译失败

C++ - 如何使显式导入的 DLL 函数对其他类可用

c++ - "Sorted:[space]"后面没有输入号码,如何去掉空格?

c++ - 点云库:如何使用 pcl::addCoordinateSystem(double scale, const Eigen::Affine3f & t, int viewport = 0))

c++ - 将 `std::addressof` 和 `operator&` 一起介绍给学生会有什么缺点吗?

c++ - (传统的,之前的 c++11 左值-)引用如何在 C++ 中工作

c++ - RValue、模板解析和复制构造函数(在 Visual C++ 2010 中)