考虑我从可变参数模板继承整个参数列表。参数如何继承?
// snippet
template<typename... R>
class foo
: public R... {
public:
};
// ....
using foo_inst = foo<bar_1, bar_2>;
我试过了,似乎所有 R
都是公共继承的(不仅仅是第一个)。 这是定义的行为吗?
我尝试使用gcc和msvc(感谢jaggedSpire也使用了clang),所有结果都相同。编译器甚至没有提到任何警告。您可以看到正在运行的示例here。
答案 0 :(得分:4)
是的,这是已定义的行为。引自14.5.3[temp.variadic]\4
一个 打包扩展 由一个 图案 和省略号,其实例化产生零或更多 列表中模式的实例化(如下所述)。模式的形式取决于上下文 哪个扩张发生。包扩展可以在以下上下文中发生:
该清单的相关背景是:
- 在 base-specifier-list 中(第10条);模式是一个 基符
因此,在参数包扩展class foo : public R...
中,模式是基本说明符 public R
,使得由T1, T2, ... , Tn
类型组成的包扩展为{ {1}}。 (前一句中的省略号用于数学序列指定意义。)