次のコードは、clang ++ 8.0.0とg ++ 9.1.0の両方で正常にコンパイルされます(コンパイルフラグは-Wall -Wextra -Werror -pedantic-errors
):
template <typename>
struct Base
{
};
struct Derived : Base<int>
{
Base base()
{
return Base();
}
};
int main()
{
}
これらのコンパイラのバグですか、それともC ++標準の機能ですか?
このコードは問題ありません。から継承するため、内部Derived
クラスBase
はを参照します。はい、合法です。Base<int>
Derived
Base<int>
標準:
14.6.1.1:通常の(非テンプレート)クラスと同様に、クラステンプレートには注入されたクラス名があります(第9節)。挿入されたクラス名は、テンプレート名またはタイプ名として使用できます。template-argument-list、テンプレートtemplate-parameterのtemplate-argument、またはフレンドクラステンプレート宣言のelaborated-type-specifierの最終識別子として使用される場合、クラステンプレート自体を参照します。 。それ以外の場合は、<>で囲まれたクラステンプレートのtemplate-nameの後にtemplate-parametersが続くのと同じです。
また:
3.4.3:クラスの注入されたクラス名(第9節)も、名前の非表示と検索の目的で、そのクラスのメンバーであると見なされます。
最後の文はそれをします。要するに、A<B>
隠された「エイリアス」を導入しますが、。なしで使用されるA = A<B>
場合にA
限り<>
ます。例では、基本クラスに導入され、派生クラスは基本クラスのすべてのメンバーを継承します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加