GCC11移除list迭代器内联==/!=运算符引发编译错误求助
问题解答
这不是GCC11的bug,也不是开发者的失误操作——你的代码依赖了GCC旧版本中不符合C++标准的实现细节,而GCC11只是修正了这个实现,使其更贴合标准要求。
原因分析
C++标准规定,容器迭代器的==和!=比较运算符必须以自由函数(非成员函数)的形式存在,而非迭代器类的成员函数。在GCC11之前,std::list的迭代器额外提供了成员版的operator==和operator!=,这属于GCC的非标准扩展。你的代码中直接通过base::operator==/base::operator!=调用成员函数,就是依赖了这个非标准实现。
GCC11的相关提交正是移除了这些非标准的成员运算符,将std::list迭代器的比较逻辑改为标准要求的自由函数形式。此时你的代码再尝试调用不存在的成员运算符,自然会报错。
正确的代码写法
你自行修改后的代码是符合标准的正确写法:
template<class I> bool operator==(const iterator_impl<I>& other) const { return this->base_reference() == other.base_reference(); } template<class I> bool operator!=(const iterator_impl<I>& other) const { return this->base_reference() != other.base_reference(); }
直接使用==/!=运算符比较迭代器对象时,编译器会通过**参数依赖查找(ADL)**找到全局的标准运算符,完全符合C++标准的要求,也能在所有合规的编译器上正常编译。
内容的提问来源于stack exchange,提问作者emar5
相关产品推荐
相关产品推荐

