右值参考和视觉2013

时间:2013-10-28 19:39:24

标签: c++ rvalue-reference

#include<iostream>
#include<vector>

struct Foo
{
    int *nb;

    Foo() :nb(new int(5)){}

    ~Foo(){ delete nb; }

    Foo(Foo&& f)
    {
            std::cout << "Move\n";
        nb = f.nb;
        f.nb = 0;
    }

}; 

std::vector<Foo> vec;

void func()
{ 
    vec.push_back(Foo()); 
}

int main()
{    
    func();
    std::cout << *(vec[0]).nb << "\n";
    std::cin.ignore();
}

运行:

> ./a.out
Move
5

在VS2013 vec.push_back(Foo());调用Foo(Foo&& f)下是否正常? 我相信Foo()是一个左值。

1 个答案:

答案 0 :(得分:2)

这很正常。由于您通过调用Foo()创建的实例永远不会分配给变量,因此编译器会将其视为r值。

一个简单的经验法则是,您创建的任何没有给出名称的对象(即没有声明)将是一个r值。

有关细节的详细解释,我建议The C++ Programming Language (4th Edition)中的第6.4.1节。