Hol*_*Cat 11 c++ iterator operator-overloading language-lawyer
->*如果重载->,显然不能自动工作,并且必须手动重载.
为什么标准容器迭代器不超载->*除了->,迫使使用(*iter).*mem_ptr代替iter->*mem_ptr?
#include <iostream>
#include <vector>
struct S
{
int x;
};
int main()
{
std::vector<S> vec = {{42}};
auto mem_ptr = &S::x;
std::cout << (*vec.begin()).*mem_ptr << '\n'; // This line compiles.
std::cout << vec.begin()->*mem_ptr << '\n'; // This line doesn't compile.
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,这些问题通常无法回答,以下是一些operator->*()不能被过多回答的原因。尽管真正的答案可能是没有人想到过。如果这对您来说是一个重要的缺失语言功能,您可以随时提交提案。
对于初学者来说,ptr->*pmdjust 并不是一个非常常用的表达方式。因此,大多数人不会错过你不会写的事实it->*pmd,尤其是当(*it).*pmd只需要额外增加 2 个字符来实现完全相同的目标时。这里的潜在上涨空间似乎相当小。尽管如此,迭代器应该与指针保持一致,这样才有意义。但...
指向成员的指针不仅仅是指向成员数据的指针,我们还可以有指向成员函数的指针,并且可以(ptr->*pmf)()今天写,ptr->*pmf其本身是格式错误的。您根本无法获得这些语义operator->*- 要使调用操作正常工作,ptr->*pmf基本上必须返回 lambda。所以现在,这实际上变得相当复杂 - 除非您只想支持ptr->*pmd. 无论采用哪种方法,都与指针不一致。
对于输入迭代器,您根本不想支持,operator->*()因为它会立即产生悬空引用。
对我个人而言,成本(弄清楚如何指定这些运算符、迭代器以及如何处理指向成员函数的指针)似乎并不值得(在很少编写的表达式中节省 2 个字符)。