c++c++11inheritancevariadic-templatestemplate-mixins

Visibility rules for mixin inheritance with variadic template


Consider I inherit from a variadic template the entire arguments list. How are the arguments inherited?

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

I tried it, and it seems all R's are inherited public (not just the first one). Is this defined behavior?

I tried it with gcc and msvc (thanks to jaggedSpire also with clang), all with same results. The compilers not even mentioned any warnings. You can see a running example here.


Solution

  • Yes, this is the defined behaviour. Quoting from 14.5.3[temp.variadic]\4

    A pack expansion consists of a pattern and an ellipsis, the instantiation of which produces zero or more instantiations of the pattern in a list (described below). The form of the pattern depends on the context in which the expansion occurs. Pack expansions can occur in the following contexts:

    The relevant context from that list is:

    ā€” In a base-specifier-list (Clause 10 ); the pattern is a base-specifier.

    Thus, in the parameter pack expansion class foo : public R..., the pattern is the base-specifier public R, making the pack composed of types T1, T2, ... , Tn expand to public T1, public T2, ... , public Tn. (Ellipsis in the previous sentence are used in the mathematical sequence-specifying sense.)