Я писал шаблон функции как
template<typename ...T>
void f(T ...t) {
X x(t...);
// ...
}
Когда я смотрел на это, мне было интересно, что происходит для звонка f()
, Будет ли неприятный анализ сделать x объявлением функции? Компиляторы, кажется, делают это переменной. Может ли кто-нибудь помочь мне быть уверенным в этом, пожалуйста?
Пустая скобка (()
) сделает это объявлением функции, только если оно написано как таковое в исходном коде.
§14.5.3 [temp.variadic] p6
также упоминает это:
Создание экземпляра расширения пакета, не являющегося выражением sizeof …, создает список E1, E2, …, EN, где N — количество элементов в параметрах расширения пакета. […] Когда N равно нулю, создание экземпляра расширения создает пустой список. Такое создание не изменяет синтаксическую интерпретацию включающей конструкции, даже в тех случаях, когда полное исключение списка в противном случае было бы некорректным или привело бы к двусмысленности в грамматике. [ Пример:
template<class... T> struct X : T... { }; template<class... T> void f(T... values) { X<T...> x(values...); } template void f<>(); // OK: X<> has no base classes // x is a variable of type X<> that is value-initialized
— конец примера ]
Смотрите конкретно второй комментарий в примере кода.
Других решений пока нет …