【发布时间】:2018-02-05 15:34:59
【问题描述】:
如果您重载->,显然->* 不会自动工作,必须手动重载。
为什么除了->之外,标准容器的迭代器不会重载->*,从而强制使用(*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->,则在返回的值上再次调用operator->,递归,直到operator->到达返回一个普通指针。之后,将内置语义应用于该指针。" en.cppreference.com/w/cpp/language/operator_member_access 即存在显着差异。 -
标准容器迭代器是否超载
operator->? std:.vector 应该简单地使用 T* 作为迭代器。 -
重载指向成员访问运算符的指针与其他重载不同,因为它的返回类型取决于参数的类型,因此必须是支持所有类型成员的模板。也许这是部分原因......
-
@manni66 是的,标准容器迭代器(都是输入迭代器)会重载
operator->。除了std::vector之外,还有其他容器不能简单地使用指针。std::vector::iterator也不需要是指针。 -
@manni66 见
std::vector<bool>(代理访问)虽然他们现在希望他们没有。
标签: c++ iterator operator-overloading language-lawyer