0

次のコードがあります。

#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 = &it;
    std::cout << *****(itp)->get_i() << "\n"; //ERROR
}

GCC と Clang++ の両方が何らかの形で または のいずれかを呼び出すことができないoperator*ため、試行した間接化の数に関係なく、最後の行でoperator->エラーが発生します。It doesn't have member function 'get_i'標準はそのような非直感的な動作を正当化しますか?

4

1 に答える 1

5

演算子の優先順位:->より緊密にバインドされるため、ポインターに適用されますitp

をオーバーロードしても、クラスへのポインタに適用される意味には影響operator->ません。operator->あなたが欲しい(*itp)->get_i();と思います。

于 2012-09-07T20:50:22.853 に答える