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),都有相同的结果.编译器甚至没有提到任何警告.你可以在这里看到一个运行的例子.
是的,这是定义的行为。引用自14.5.3[temp.variadic]\\4
\n\n\n包 扩展由模式和省略号组成 ,其实例化在列表中产生零个或多个模式实例(如下所述)。模式的形式取决于扩展发生的上下文。包扩展可能发生在以下环境中:
\n
该列表中的相关上下文是:
\n\n\n\n\n\xe2\x80\x94 在基本说明符列表中(第 10 条);该模式是 \n 基本说明符。
\n
因此,在参数包扩展中class foo : public R...,模式是基本说明符 public R,使得由类型组成的包T1, T2, ... , Tn扩展为public T1, public T2, ... , public Tn。(前一句中的省略号用于指定数学序列的意义。)