gpt4 book ai didi

c++ - 为什么 std::{container}::emplace 不推断其参数类型?

转载 作者:太空狗 更新时间:2023-10-29 21:11:07 25 4
gpt4 key购买 nike

假设我有这段代码:

#include <string>
#include <unordered_set>

struct command_node {
std::string key, value;
};

bool operator==(const command_node &x, const command_node &y) {
return x.key == y.key;
}

namespace std {
template<>
struct hash<command_node> {
typedef command_node argument_type;
typedef size_t result_type;
size_t operator()(const command_node &x) const {
return std::hash<std::string>()(x.key);
}
};
}

using command_set = std::unordered_set<command_node>;

int main(int argc, char **argv)
{
command_set commands;

commands.emplace(
command_node{"system", "running"}
);

return EXIT_SUCCESS;
}

它只是创建一个 command_node 结构的 unordered_list。该代码仅供说明。

问题:在主要方面,这是可行的(如上所示):

    commands.emplace(
command_node{"system", "running"}
);

但这不是:

    commands.emplace(
{"system", "running"}
);

然而,如果我将 emplace 替换为 insert,无论哪种方式都有效。换句话说,这有效:

    commands.insert(
{"system", "running"}
);

为什么 emplace 不推断 command_node

最佳答案

这是因为基于转发引用的完美转发因花括号初始化列表而失败:对于编译器来说,这是一个“非推导上下文”。相反,将参数传递给容器的基础值类型构造函数。

插入方法不同:它们接受 const value_type& 左值引用或右值引用 (value_type&&)。因此,传递一个初始化类型的花括号初始化列表效果很好。

关于c++ - 为什么 std::{container}::emplace 不推断其参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51546642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com