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

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

// 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, (Многоточие в предыдущем предложении используется в математическом смысле, определяющем последовательность.)

Другие вопросы по тегам