初始化器列表不是表达式,因此它们没有类型,也不会产生值。这意味着以下内容:
{std::move(key),std::move(value)}
本身不会创建一对。初始化列表只是一个用于初始化的语法结构,在这种情况下,函数参数将通过直接调用pairtype
withstd::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)))