c++ - 为什么我们需要在 C++20 中的 map emplace 中使用 piecewise_construct?
问题描述
这是关于 std::map emplace 函数的潜在重载的理论问题,该函数检测到它已通过 2 个元组,而不是 C++20 中是否存在此功能的问题。
从我在之前的问题地图中看到的 emplace 是 std::pair 问题的“受害者”。
所以这让我想知道为什么只有当我们将 2 个元组传递给 emplace(并且键/值可以从各自的元组构造)时,map emplace 没有概念/SFINAE 重载才有效。
我想到的原因:
- 将 std::tuple 作为构造函数的参数的怪异类(可能它们也有 ctor,该元组的类型扩展为普通参数)
- 没有人认为通过解决一个特定问题来节省一点打字时间是值得的
解决方案
将 std::tuple 作为构造函数参数的怪异类
对,就是这样。
如果您决定m.emplace(x, y)
自动x
为元组和执行分段构造功能y
,那么我将不可能构建此:
struct Key { Key(std::tuple<int, int>); bool operator<(Key const&) const; };
struct Value { Value(std::tuple<char>); };
map<Key, Value> m;
m.emplace(std::tuple(1, 2), std::tuple('3'));
我需要tuple
为这两种类型提供 s ,但相反,我总是得到两个int
s forKey
和一个char
for Value
,但这是行不通的。我必须要么添加一个额外的构造函数,Key
要么不做任何安放。
现在,如果您跟进并说,好吧,m.emplace(x, y)
如果piecewise_construct
和x
是y
元组,并且分段构造实际上是有效的......那么,首先,这变得相当复杂。但是,如果两种结构都有效怎么办?
struct Key2 {
Key2(std::tuple<int, int>);
Key2(int, int);
bool operator<(Key2 const&) const;
};
map<Key2, Value> m2;
m2.emplace(std::tuple(1, 2), std::tuple('3'));
现在这总是使用(int, int)
构造函数。这是用户在这里的意图吗?
基本上,将它们分开意味着用户可以做他们需要的事情并且没有歧义。
推荐阅读
- spring-boot - 如何使用 swagger OpenAPI 注释将描述设置为字段
- java - 如何在 Java 中声明任何类类型的变量或对象
- javascript - 如何将时间设置为始终:00:00:00?
- python-3.x - 是否可以将句子拆分为字符串列表并将同一行中的字符串列表大写?
- flutter - 为 Flutter 开发人员制作 UI 的最快方法?
- javascript - nodejs url.resolve 函数有什么替代品吗?
- javascript - 将 JS 翻译成数学(定义了多个变量)
- javascript - Discord.js 什么都不做
- pandas - 对 DataFrame 中的条目进行分组和计数
- unix - 如果 Unix 进程关闭,它会自行启动