5

引数リスト全体を可変個引数テンプレートから継承するとします。引数はどのように継承されますか?

// snippet
template<typename... R>
class foo
    : public R... {
public: 
};
// ....
using foo_inst = foo<bar_1, bar_2>;

私はそれを試してみましたが、すべて Rが public に継承されているようです(最初のものだけではありません)。これは定義された動作ですか?

gcc と msvc で試してみました ( clang でもjaggedSpireに感謝します)、すべて同じ結果でした。コンパイラは、警告についても言及していません。ここで実行例を見ることができます。

4

1 に答える 1

4

はい、これは定義された動作です。からの引用14.5.3[temp.variadic]\4

パック展開パターンと省略記号で構成され、その インスタンス化により、リスト内のパターンのゼロ個以上のインスタンス化が生成されます (後述)。パターンの形式は、展開が発生するコンテキストによって異なります。パック拡張は、次のコンテキストで発生する可能性があります。

そのリストからの関連するコンテキストは次のとおりです。

base-specifier-list (第 10 節); パターンは base-specifierです。

したがって、パラメーター パック展開class foo : public R...では、パターンはbase-specifier public Rであり、型で構成されるパックは にT1, T2, ... , Tn展開されpublic T1, public T2, ... , public Tnます。(前の文の省略記号は、数学的順序指定の意味で使用されています。)

于 2015-07-13T16:58:29.120 に答える