Являются ли переменные аргументы после корректного формирования дефолтного параметра?

template <typename... Args>
void bark( int = 0, Args&&... args ) {}

int main() {
     bark();
     bark(1);
     bark(1, 2);
}

Является ли этот код хорошо сформированным в соответствии со стандартом С++?

Предлагаемый дубликат не содержит одинаковых вызовов функции.

Ответы

Ответ 1

Благодаря CWG 777 объявление действительно:

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

Вывод должен преуспеть во всех трех случаях, поскольку аргумент по умолчанию не имеет никакого отношения к характеру вычитания: если аргумент параметра пакета args не указан, он выводит пустой пакет через [temp.arg.explicit]/3, в противном случае применяется обычное правило в [temp.deduct.call]/1 (как пакет явно не в контексте, не выведенном).