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