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


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

template<typename ...T>
void f(T ...t) {
  X x(t...);
  // ...
}
Когда я смотрел на него, мне было интересно, что происходит для вызова f(). Сделает ли досадный синтаксический анализ X объявлением функции? Компиляторы, похоже, делают его переменной. Может кто-нибудь помочь мне быть уверенным в этом, пожалуйста?
1 15

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

-конец примера ]

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