Ответ 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 пример]
См., в частности, второй комментарий в примере кода.