在 GCC 上自动声明映射迭代器错误



>我有一个地图定义为:

std::map<unsigned int, std::string> spCalls;  

我还有一个返回字符串的函数,给定键。它被定义为:

std::string spGetCallString(unsigned int key)
{
auto iter{ spCalls.find(key) };
return iter->second;
}

尝试使用 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;"

我只是无法理解这一点,我看不出为什么我的代码不应该工作。我感谢任何帮助。

在 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.

在直接列表初始化中

(但不是在复制列表初始化中), 当从大括号初始化列表中推断出汽车的含义时, 大括号初始化列表必须只包含一个元素,并且 auto 的类型 将是该元素的类型:

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));

最新更新