次のコードを見てください
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
gcc 6.1、clang 3.8 、および msvc 2015 update 3 のすべては、これをコンパイルすることを拒否Aします。gcc はのデフォルト コンストラクタを参照しているようです。msvc と clang はそうではないようです。CABAusing base_type = AA
おそらく、コンパイル エラーは、継承によってトリガーされた名前の挿入が原因である可能性があります (すべてのコンパイラが正常に動作するように変更using base_type = Aするため)。using base_type = ::A
より具体的には、
- 私が理解したように、 のよう
A::typeに、Aは単なるクラス名 (gcc はそれを関数名と誤解しますが) であり、C内部Aではなく、またはに導入されBます。この名前が のプライベートと見なされるのはなぜBですか? - このコンパイル エラーはバグと見なすべきですか、それとも標準の仕様の特殊なケースですか?