【发布时间】:2012-09-01 18:04:07
【问题描述】:
我有以下代码:
#include <iostream>
struct Base {
int i_;
};
class El : protected Base {
public:
int get_i() const { return i_; }
void set_i(int i) { i_ = i; }
};
class It : protected Base {
public:
using pointer = const El*;
using reference = const El&;
reference operator*() const
{
return reinterpret_cast<reference>(*this);
}
pointer operator->() const
{
return reinterpret_cast<pointer>(this);
}
};
int main()
{
It it;
It* itp = ⁢
std::cout << *****(itp)->get_i() << "\n"; //ERROR
}
GCC 和 Clang++ 都无法调用operator* 或operator->,所以无论我尝试了多少次间接调用,最后一行都会出现错误It doesn't have member function 'get_i'。标准是否保证这种不直观的行为?
【问题讨论】:
-
从
It到El的reinterpret_cast是未定义的行为。即使你让它编译,也不能保证生成的代码会工作。 -
额外问题:如何以不调用 UB 的方式执行此操作?我有一些数据,我想有两个视图。
-
@jons34yp:为什么不让
It派生自El,也许是私下里?基本上,您会竭尽全力(并打破严格的别名)只是为了阻止有人在It上调用get_i()。但也许在你的真实代码中,El有一些运算符与It的运算符冲突。通常你编写迭代器来引用元素,而不是每个元素都是它自己的迭代器,所以我猜发生了一些有趣的事情。 -
在实际代码中
El本身就是一个迭代器——它指的是不能表示为对象的数据。无论如何,感谢您的建议,这是一个很好的改进。
标签: c++ operator-overloading indirection