次のコードを見てください
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 はそうではないようです。C
A
B
A
using base_type = A
A
おそらく、コンパイル エラーは、継承によってトリガーされた名前の挿入が原因である可能性があります (すべてのコンパイラが正常に動作するように変更using base_type = A
するため)。using base_type = ::A
より具体的には、
- 私が理解したように、 のよう
A::type
に、A
は単なるクラス名 (gcc はそれを関数名と誤解しますが) であり、C
内部A
ではなく、またはに導入されB
ます。この名前が のプライベートと見なされるのはなぜB
ですか? - このコンパイル エラーはバグと見なすべきですか、それとも標準の仕様の特殊なケースですか?