2

在 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?
4

1 回答 1

8

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

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

本身不会创建一对。初始化列表只是一个用于初始化的语法结构,在这种情况下,函数参数将通过直接调用pairtypewithstd::move(key)std::move(value)as arguments 的构造函数来构造。

不涉及创建临时对象 - 唯一需要注意的是explicit在执行列表初始化时不会考虑构造函数(例如,这不适用于 的实例std::tuple<>)。

这意味着foo我们刚刚讨论过的调用,即:

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

在技​​术上与此调用不同:

foo(std::move(pairtype(std::move(key),std::move(value)))

在这里,您有意创建一个临时变量并将其移动到函数参数中(编译器可能会根据 12.8/31 忽略此移动,但这是另一回事)。

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

foo(pairtype(std::move(key),std::move(value)))

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

foo(std::make_pair(std::move(key),std::move(value)))
于 2013-07-09T17:16:00.170 回答