C++ `std::map::at()`不支持std::string\u视图吗?
我在代码中大量使用异常,因此我更喜欢使用C++ `std::map::at()`不支持std::string\u视图吗?,c++,C++,我在代码中大量使用异常,因此我更喜欢使用at()而不是find()来查找元素,但我刚刚发现at()似乎不支持std::string\u view,例如: #include <map> #include <iostream> std::map<std::string, int, std::less<>> map{ {"one", 1}, {"two", 2}, }; const char* c
at()
而不是find()
来查找元素,但我刚刚发现at()
似乎不支持std::string\u view
,例如:
#include <map>
#include <iostream>
std::map<std::string, int, std::less<>> map{
{"one", 1},
{"two", 2},
};
const char* c = "onetwothree";
int main() {
std::string_view s(&c[3], 3);
std::cout << map.find(s)->second << std::endl;
std::cout << map.at(s) << std::endl; // will not compile
}
#包括
#包括
地图{
{“一”,1},
{“两个”,2},
};
const char*c=“一对三”;
int main(){
std::string_视图s(&c[3],3);
std::cout second自C++14标准以来,该函数已模板化重载,支持与键等效的值
该函数没有此类重载。传递给at
的值必须与键的类型相同(或隐式转换为键的类型)。我不认为at
有充分的理由不支持这一点。当找不到值时,它不必在映射中插入任何内容(因此不必尝试将随机对象类型转换为键类型),这样就可以进行透明查找。操作符[]
对此不起作用。我认为at
不支持它,因为它应该与操作符[]配对
在很多方面。@Someprogrammerdude我认为透明的比较器(即less
)是用于异构查找的?(调用find
至少在其他情况下不会编译。)