Подтвердить что ты не робот

Могут ли аргументы функции параметров пакета использоваться по умолчанию?

Это точка, о которой gcc 4.9.2 и clang 3.5.2 находятся в резком разногласие. Программа:

template<typename ...Ts>
int foo(int i = 0, Ts &&... args)
{
    return i + sizeof...(Ts);
}

int main()
{
    return foo();
}

компилируется без комментариев из gcc (-std=c++11 -Wall -pedantic). Кланг говорит:

error: missing default argument on parameter 'args'

С foo с поправкой на:

template<typename ...Ts>
int foo(int i = 0, Ts &&... args = 0)
{
    return i + sizeof...(Ts);
}

clang не жалуется, но gcc говорит:

error: parameter pack ‘args’ cannot have a default argument

Какой компилятор прав?

4b9b3361

Ответ 1

Из 8.3.6 ([dcl.fct.default])/3:

Аргумент по умолчанию не указывается для пакета параметров.

Из 8.3.6 ([dcl.fct.default])/4:

В объявлении определенной функции каждый параметр, следующий за параметром с аргументом по умолчанию, должен иметь аргумент по умолчанию, указанный в этом или предыдущем объявлении, или должен быть пакетом параметров функции.

Таким образом, это позволяет использовать код, например void f(int a = 10, Args ... args), или как ваш первый фрагмент. (Спасибо @T.C. для поиска второго предложения!)

Ответ 2

A Kerrek SB говорит, что это невозможно. Вместо этого вы можете использовать std::tuple

template <class ... Args>
void foo( std::tuple<Args...> t = std::tuple<int>(0) )
{}