为什么标准容器迭代器不会重载` - > *`?

By simon at 2018-02-07 • 0人收藏 • 26人看过

显然->*不能自动工作,如果你超载 ->,必须手动超载。 为什么迭代器对于标准容器,不要超载->* 到->,强制使用(*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.
}

2 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

由于这些问题通常不能回答,这里有一个 operator->*()可能不会超载的几个原因。虽然这是可能的 真正的答案是没有人想到它。如果这对你来说是重要的 缺少语言featu你可以随时[提交一个 提议](https://isocpp.org/std/submit-a-proposal)。


对于初学者来说,ptr->*pmd就不是一个非常常用的表达式 一般。所以你不能写it->*pmd的事实不是这样的 大多数人miss,特别是当(*it).*pmd完全一样时 目标只需要2个额外的字符。潜力上升在这里似乎 相当小。尽管如此,迭代器应该与指针一致,所以它会 合理。但... 指向成员rs不只是指向成员数据的指针,我们也可以有 指向成员函数,可以写(ptr->*pmf)()今天在哪里 ptr->*pmf本身是不合格的。你根本无法获得这些语义 与operator->* - 将呼叫操作转到work,ptr->*pmf会 必须基本上返回一个lambda。所以,现在,这实际上变得相当 复杂 - 除非你想只需要支持ptr->*pmd 方法,你不符合指针。 对于输入迭代器,你不想支持rt operator->*()因为它 会立即产生一个悬而未决的参考。 对我个人而言,成本(了解如何o指定这些运算符 哪些迭代器,以及如何处理指向成员函数的指针)没有 真的很值得好处(在表达式中保存2个字符) 很少写)。

2018-02-07   #2

由于这些问题通常不能回答,这里有一个 operator->*()可能不会超载的几个原因。虽然这是可能的 真正的答案是没有人想到它。如果这对你来说是重要的 缺少语言featu你可以随时[提交一个 提议](https://isocpp.org/std/submit-a-proposal)。


对于初学者来说,ptr->*pmd就不是一个非常常用的表达式 一般。所以你不能写it->*pmd的事实不是这样的 大多数人miss,特别是当(*it).*pmd完全一样时 目标只需要2个额外的字符。潜力上升在这里似乎 相当小。尽管如此,迭代器应该与指针一致,所以它会 合理。但... 指向成员rs不只是指向成员数据的指针,我们也可以有 指向成员函数,可以写(ptr->*pmf)()今天在哪里 ptr->*pmf本身是不合格的。你根本无法获得这些语义 与operator->* - 将呼叫操作转到work,ptr->*pmf会 必须基本上返回一个lambda。所以,现在,这实际上变得相当 复杂 - 除非你想只需要支持ptr->*pmd 方法,你不符合指针。 对于输入迭代器,你不想支持rt operator->*()因为它 会立即产生一个悬而未决的参考。 对我个人而言,成本(了解如何o指定这些运算符 哪些迭代器,以及如何处理指向成员函数的指针)没有 真的很值得好处(在表达式中保存2个字符) 很少写)。

登录后方可回帖

Loading...