为什么移动构造函数没有调用没有std :: move?

时间:2014-10-09 02:25:27

标签: c++ c++11 move-semantics

我有这段代码:

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

有人可以向我解释为什么移动构造函数在没有'std :: move'的情况下不会调用'internal_container'吗?

2 个答案:

答案 0 :(得分:2)

由于

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

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

这就是你必须明确启用移动的原因。

答案 1 :(得分:2)

只要从相同类型的xvalue初始化对象,就会调用移动构造函数。您可以通过调用xvalue来创建std::move(x)。将参数声明为右值参考不会自动使其成为xvalue