Inf*_*kin 3 c++ gcc auto c++11 c++17
我的地图定义为:
std::map<unsigned int, std::string> spCalls;
Run Code Online (Sandbox Code Playgroud)
我还有一个函数,在给定键的情况下返回字符串.它被定义为:
std::string spGetCallString(unsigned int key)
{
auto iter{ spCalls.find(key) };
return iter->second;
}
Run Code Online (Sandbox Code Playgroud)
当试图用GCC编译它时,我得到一个错误
error: base operand of '->' has non-pointer type
'std::initializer_list < std::_Rb_tree_iterator < std::pair < const unsigned int, std::basic_string < char> > > >'
return iter->second;"
Run Code Online (Sandbox Code Playgroud)
我只是无法理解这一点,我不明白为什么我的代码不起作用.我感谢任何帮助.
在C++ 17之前,对于支撑初始值设定项的自动类型推导将始终产生实例化的类型std::initializer_list,因此auto iter{ spCalls.find(key) };,类型iter将是std::initializer_list<std::map<unsigned int, std::string>::iterator>,它根本不符合用法.
从C++ 17开始,你将获得正确的类型,即std::map<unsigned int, std::string>::iterator.
在直接列表初始化(但不是在copy-list-initalization中)中,当从braced-init-list 推导出auto的含义时,braced-init-list必须只包含一个元素,而auto类型的类型是该元素的类型:
Run Code Online (Sandbox Code Playgroud)auto x1 = {3}; // x1 is std::initializer_list<int> auto x2{1, 2}; // error: not a single element auto x3{3}; // x3 is int (before C++17 it was std::initializer_list<int>)
如果您的编译器仍不支持,您可以将支持的初始化程序更改为其他初始化程序,例如
auto iter = spCalls.find(key);
auto iter(spCalls.find(key));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |