可变模板混合继承的可见性规则

Visibility rules for mixin inheritance with variadic template

本文关键字:可见性 规则 继承 混合      更新时间:2023-10-16

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

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

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

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

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

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

列表中的相关上下文是:

-在base-specifier-list(第10条);模式是 base-specifier .

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