#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()是一个左值。
答案 0 :(得分:2)
这很正常。由于您通过调用Foo()创建的实例永远不会分配给变量,因此编译器会将其视为r值。
一个简单的经验法则是,您创建的任何没有给出名称的对象(即没有声明)将是一个r值。
有关细节的详细解释,我建议The C++ Programming Language (4th Edition)中的第6.4.1节。