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

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

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

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

15

Решение

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

§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

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

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

13

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]