在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?
答案 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()