这一对会被移动吗?

时间:2013-07-09 17:05:13

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

在C ++ 11标准下,是否保证将以下对移入函数?

//objects available: key, value
//corresponding type available: pairtype
//function available: void foo(pairtype pair); copies the pair by default

foo({std::move(key),std::move(value)}); //pair moved?

还是我必须自己动手?

foo(std::move(pairtype(std::move(key),std::move(value))); //needed?

1 个答案:

答案 0 :(得分:8)

初始化列表不是表达式,因此它们没有类型,并且它们不会产生值。这意味着以下内容:

{std::move(key),std::move(value)}

本身不会创建一对。初始化列表只是用于初始化的语法结构,在这种情况下,函数参数将由直接构造pairtype std::move(key)std::move(value)的构造函数构造作为参数。

没有涉及temporaries的创建 - 唯一需要注意的是在执行列表初始化时不会考虑explicit构造函数(例如,这不适用于{{1 }})。

这意味着我们刚刚讨论的std::tuple<>的调用,即:

foo

技术上与此调用不同:

foo({std::move(key),std::move(value)}

在这里,你有意创建一个临时的并将其移动到函数参数中(然后编译器可以按照12.8 / 31忽略此移动,但这是另一个故事)。

请注意,此处对foo(std::move(pairtype(std::move(key),std::move(value))) 的调用是多余的,因为临时值是右值。无论如何,函数参数将从临时对象移动构造。因此,您可以写:

std::move()

请注意,foo(pairtype(std::move(key),std::move(value))) 将是pairtype类模板的实例,这意味着您必须手动指定模板参数。为避免这种情况,您可以使用std::pair<>

std::make_pair()