11

このコードでは、b1 への割り当ては機能しますが、b2 への割り当ては許可されません (静的キャストの有無にかかわらず)。私は実際には反対の問題であるパブリック継承を解決しようとしていましたが、暗黙的にベースに変換することはありませんでした。ただし、キャスト演算子は使用されていないようです。どうしてこれなの?

struct B {};    

struct D1 : private B {
    operator B&() {return *this;}
    B& getB() {return *this;}
};

struct D2 : public B {
    explicit operator B&() {return *this;}
};

struct D3 : public B {
    operator B&() = delete;
};

void funB(B& b){}

int main () {
  D1 d1;
  funB(d1.getB()); // works
  // funB(d1); // fails to compile with 'inaccessible base class
  D2 d2;
  funB(d2); // works
  D3 d3;
  funB(d3); // works 
  return 0;
}
4

1 に答える 1