为何编译器不会为迭代器自动生成operator->()?
为什么C++编译器不自动生成迭代器的operator->()?
我在编写迭代器Iter,希望std::iterator_traits<Iter>能从中推导出尽可能多的类型信息。根据我的理解,这个迭代器需要满足C++标准中仅作说明性用途的__LegacyInputIterator概念,而该概念明确要求迭代器必须实现operator->()。
我认为在99%的场景下,operator->()的行为在逻辑上和operator*()完全一致——本质就是返回operator*()结果的地址,按理说编译器完全可以自动生成这个函数,但测试显示编译器并没有这么做。
这背后是否存在合理的设计原因?我是不是遗漏了什么关键的细节?
补充测试代码
#include <iterator> using namespace std; pair<int, int> p{0,0}; template<class T> concept has_arrow = requires(T t){ *t; t->first; }; struct MyIter { using difference_type = ptrdiff_t; using value_type = pair<int, int>; using reference = value_type&; using pointer = value_type*; reference operator*() { return p; } // 取消注释以下代码可修复编译错误 //pointer operator->() { return &p; } }; int main() { // 错误:“->”的基础操作数具有非指针类型“MyIter” static_assert(has_arrow<MyIter>); }
内容的提问来源于stack exchange,提问作者igel
相关产品推荐
相关产品推荐

