0
#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

VS2013vec.push_back(Foo());调用下正常Foo(Foo&& f)吗?我相信 Foo() 是一个左值。

4

1 回答 1

2

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

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

为了更好地解释细节,我推荐The C++ Programming Language (4th Edition)中的第 6.4.1 节。

于 2013-10-28T19:46:54.270 回答