由于C++ 14(N3657)成员函数模板find,count,lower_bound,upper_bound,和equal_range关联的容器支持异构比较查找但at并operator[]没有那些等效的成员函数的模板.为什么会这样 ?
示例:
std::map<std::string, int, std::less<>> m;
// ...
auto it = m.find("foo"); // does not construct an std::string
auto& v = m.at("foo"); // construct an std::string
Run Code Online (Sandbox Code Playgroud)
原则上没有合乎逻辑的理由.例如,对于operator[]合理的语义可以
key_type使用它的搜索相当,并且key_type仅在需要时转换为(即,如果找不到元素且容器既不是const也不是使用const引用访问).key_type使用operator[]应该只是不编译(就像现在发生的那样)key_type但可以转换为key_type则应立即创建临时文件以进行搜索并可能进行插入(就像现在一样).当然,应该有x < y一个T元素x和一个key_type元素的要求y 当且仅当 key_type(x) < y因为其他语义是无意义的(例如,如果必须operator<基于随机源返回值则是无意义的).
不幸的是C++模板机器是在同一时间极其复杂,极其微弱和实施转换key_type为operator[]只在真正需要可能比看起来更复杂.
然而,这个机制是C++社区决定谴责自己用于元编程的东西,直到有人设法仅使用它来获得一个体面的实现,这个合理的要求可能不会在标准中(过去它发生在标准的强制定义和/或基本上不可能像模板导出一样实现的东西,这并不好笑.