Может ли X x (t...) когда-либо приводить к объявлению функции с досадным анализом?

Я писал шаблон функции как

template<typename ...T>
void f(T ...t) {
  X x(t...);
  // ...
}

Когда я смотрел на него, мне было интересно, что произойдет для звонка f(). Будет ли раздражающий анализ сделать x объявлением функции? Компиляторы, похоже, делают его переменной. Может кто-нибудь помочь мне быть уверенным в этом, пожалуйста?

Ответы

Ответ 1

Пустая скобка (()) сделает ее объявлением функции, только если она написана как таковая в исходном коде.

§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

-end пример]

См., в частности, второй комментарий в примере кода.