次のコードがあります。
#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'
標準はそのような非直感的な動作を正当化しますか?