Правила видимости для смешанного наследования с вариационным шаблоном
Предположим, я наследую от шаблона с переменными значениями весь список аргументов. Как аргументы наследуются?
// snippet
template<typename... R>
class foo
: public R... {
public:
};
// ....
using foo_inst = foo<bar_1, bar_2>;
Я попробовал, и, кажется, все R
Унаследованы общественность (не только первый). Это определенное поведение?
Я попробовал это с gcc и msvc (благодаря jaggedSpire также с clang), все с теми же результатами. Компиляторы даже не упомянули никаких предупреждений. Вы можете увидеть бегущий пример здесь.
1 ответ
Да, это определенное поведение. Цитировать из 14.5.3[temp.variadic]\4
Расширение пакета состоит из шаблона и многоточия, создание экземпляров которого приводит к нулю или большему числу экземпляров шаблона в списке (описанном ниже). Форма шаблона зависит от контекста, в котором происходит расширение. Расширения пакета могут происходить в следующих контекстах:
Соответствующий контекст из этого списка:
- в списке базовых спецификаторов (пункт 10); шаблон является базовым спецификатором.
Таким образом, в расширении пакета параметров class foo : public R...
, шаблон является базовым спецификатором public R
, делая пакет состоит из типов T1, T2, ... , Tn
расширить до public T1, public T2, ... , public Tn
, (Многоточие в предыдущем предложении используется в математическом смысле, определяющем последовательность.)