Может х X(Т...) когда-нибудь вылиться в объявление функции с неприятной разбора?
Я писал шаблон функции как
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
-конец примера ]
Смотрите, в частности, второй комментарий в примере кода.