mixin继承与可变参数模板的可见性规则

use*_*087 5 c++ inheritance template-mixins variadic-templates c++11

考虑我从一个可变参数模板继承整个参数列表.参数如何继承?

// snippet
template<typename... R>
class foo
    : public R... {
public: 
};
// ....
using foo_inst = foo<bar_1, bar_2>;
Run Code Online (Sandbox Code Playgroud)

我试过了,似乎所有 R的都是公共的继承(不仅仅是第一个).这是定义的行为吗?

我用gcc和msvc试了一下(感谢jaggedSpire也用clang),都有相同的结果.编译器甚至没有提到任何警告.你可以在这里看到一个运行的例子.

Pra*_*han 4

是的,这是定义的行为。引用自14.5.3[temp.variadic]\\4

\n\n
\n

包 扩展由模式和省略号组成 ,其实例化在列表中产生零个或多个模式实例(如下所述)。模式的形式取决于扩展发生的上下文。包扩展可能发生在以下环境中:

\n
\n\n

该列表中的相关上下文是:

\n\n
\n

\xe2\x80\x94 在基本说明符列表中(第 10 条);该模式是 \n 基本说明符。

\n
\n\n

因此,在参数包扩展中class foo : public R...,模式是基本说明符 public R,使得由类型组成的包T1, T2, ... , Tn扩展为public T1, public T2, ... , public Tn。(前一句中的省略号用于指定数学序列的意义。)

\n