为什么标准容器迭代器不会重载"->*"?
Why standard container iterators don't overload `->*`?
显然,如果你重载->
->*
它不会自动工作,并且必须手动重载。
为什么标准容器的迭代器除了->
之外,不会重载->*
,强制使用(*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.
}
需要注意的是,这些问题通常无法回答,以下是operator->*()
可能不会过载的几个原因。虽然有可能真正的答案是没有人想到它。如果这对您来说是一个重要的缺失语言功能,您可以随时提交提案。
对于初学者来说,ptr->*pmd
通常不是一个非常常用的表达方式。因此,你不能写it->*pmd
的事实并不是大多数人错过的,尤其是当(*it).*pmd
以 2 个额外字符为代价实现完全相同的目标时。这里的潜在上行空间似乎相当小。尽管如此,迭代器应该与指针一致,所以这是有意义的。但。。。
指向成员的指针不仅仅是指向成员数据的指针,我们还可以具有指向成员函数的指针,并且可以编写(ptr->*pmf)()
,其中ptr->*pmf
本身的格式不正确。你根本无法用operator->*
获得这些语义 - 要使调用操作正常工作,ptr->*pmf
基本上必须返回一个 lambda。所以现在,这实际上变得相当复杂 - 除非你想只支持ptr->*pmd
.使用任何方法,您都与指针不一致。
对于输入迭代器,您根本不希望支持operator->*()
,因为它会产生一个立即悬而未决的引用。
就我个人而言,成本(弄清楚如何指定这些运算符,为哪些迭代器以及如何处理指向成员函数的指针)似乎并不值得(在很少编写的表达式中保存 2 个字符)。
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 重载Singly Linked List中的赋值运算符
- 取消引用运算符不能重载