Могут ли аргументы функции параметров пакета использоваться по умолчанию?
Это точка, о которой 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
Какой компилятор прав?
Ответы
Ответ 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) )
{}