如果您重载->*
,并且必须手动重载,->
显然不会自动运行。
除了->*
之外,为什么标准容器的迭代器不会超载->
,强制使用(*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.
}
答案 0 :(得分:2)
需要注意的是,这些问题通常无法回答,以下是operator->*()
可能不会超载的几个原因。尽管可能真正的答案是没有人想到它。如果这对您来说是一个重要的缺失语言功能,您可以随时submit a proposal。
对于初学者来说,ptr->*pmd
通常不是一个非常常用的表达方式。因此,你不能写it->*pmd
的事实并不是大多数人都错过的事情,特别是当(*it).*pmd
以两个额外字符为代价完成同一个目标时。这里潜在的好处似乎相当小。仍然,迭代器应该与指针一致,所以它是有道理的。但...
指向成员的指针不是指向成员数据的指针,我们也可以指向成员函数,并且今天可以编写(ptr->*pmf)()
,其中ptr->*pmf
本身就是格式错误。您无法使用operator->*
获取这些语义 - 要使调用操作正常工作,ptr->*pmf
必须基本上返回一个lambda。所以现在,这实际上变得相当复杂 - 除非你想支持ptr->*pmd
。使用任何方法,您都会与指针不一致。
对于输入迭代器,您根本不想支持operator->*()
,因为它会产生一个立即悬空的引用。
就我而言,个人而言,成本(弄清楚如何指定这些运算符,迭代器以及如何处理指向成员函数的指针)并不值得获益(在表达式中保存2个字符)很少写的。)