2014-10-09 53 views
2

我有这样的代码:为什么移动构造函数不会调用没有std :: move?

SomeType::SomeType(std::vector<Item>&& container, const float someOtherPArameter) 
    : internal_container(std::move(container)) 
{ 
    // some code here 
} 

有人可以给我解释为什么一个移动构造函数并不要求不“的std ::移动”的“internal_container”?

+3

名称的东西是左值(即使它们被声明为左值引用)。不要问我为什么 – 2014-10-09 02:28:57

+5

@Matt McNabb因为程序可能仍然指向他们。哲学是,如果程序无法再看它,窃取对象的胆量(可能除了它的析构函数)也是可以的。只有未命名的临时人员符合资格。 'std :: move'是程序覆盖它的一种方式,以提供明确的许可。 – 2014-10-09 02:45:12

回答

2

无论何时从同一类型的xvalue初始化对象,都会调用移动构造函数。您可以致电std::move(x)创建xvalue。将参数声明为右值引用不会自动使其成为xvalue

+0

在你的第一句话中,s/xvalue/rvalue /'。 – 2014-10-09 03:31:50

2

因为

SomeType::SomeType(std::vector<Item>&& container, const float someOtherPArameter) 
    : internal_container(container) 
{ 
    // the parameter container is in scope here 
} 

这将是非常令人惊讶的,如果,在构造函数体内,访问参数container发现了一个移动,从对象。 (它也会破坏在C++ 03中完全有效的代码)

这就是为什么你必须明确地启用移动。

相关问题