Правила видимости для смешанного наследования с вариационным шаблоном

Предположим, я наследую от шаблона с переменными значениями весь список аргументов. Как аргументы наследуются?

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

Я попробовал, и кажется все RУнаследованы общественность (не только первый). Это определенное поведение?

Я пробовал это с gcc и msvc (спасибо jaggedSpire также с лязгом), все с теми же результатами. Компиляторы даже не упомянули никаких предупреждений. Вы можете увидеть бегущий пример Вот.

5

Решение

Да, это определенное поведение. Цитировать из 14.5.3[temp.variadic]\4

расширение пакета
состоит из
шаблон
и многоточие, создание которого дает ноль или более
создание экземпляров шаблона в списке (описано ниже). Форма шаблона зависит от контекста в
который происходит расширение. Расширения пакета могут происходить в следующих контекстах:

Соответствующий контекст из этого списка:

— В базовый спецификатор-лист (Пункт 10); шаблон является
базовый спецификатор.

Таким образом, в расширении пакета параметров class foo : public R...шаблон является базовый спецификатор public R, делая пакет состоит из типов T1, T2, ... , Tn расширить до public T1, public T2, ... , public Tn, (Многоточие в предыдущем предложении используется в математическом смысле, определяющем последовательность.)

4

Другие решения


По вопросам рекламы [email protected]