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

时间:2015-07-13 16:43:33

标签: c++ c++11 inheritance variadic-templates template-mixins

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

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

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

我尝试使用gcc和msvc(感谢jaggedSpire也使用了clang),所有结果都相同。编译器甚至没有提到任何警告。您可以看到正在运行的示例here

1 个答案:

答案 0 :(得分:4)

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

  

一个   打包扩展   由一个   图案   和省略号,其实例化产生零或更多   列表中模式的实例化(如下所述)。模式的形式取决于上下文   哪个扩张发生。包扩展可以在以下上下文中发生:

该清单的相关背景是:

  

- 在 base-specifier-list 中(第10条);模式是一个   基符

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