5

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

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

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

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

4

1 回答 1

4

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

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

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

— 在基本说明符列表中(第 10 条);模式是一个 基本说明符

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

于 2015-07-13T16:58:29.120 回答