Является ли следующий код допустимым в C ++?
void f(void* = 0)
{}
int main()
{
f();
}
На какой странице стандарта C ++ указано, что это использование разрешено?
Да, это законно.
Не существует стандартной формулировки, позволяющей конкретно использовать эту комбинацию функций; там просто нет запрещать это тоже.
Синтаксис аргумента по умолчанию применяется к параметрам функции в Параметр декларирование:
[C++11: 8.3.6/1]:
Если инициализатор-раздел указан в Параметр декларирование этот инициализатор-раздел используется в качестве аргумента по умолчанию. Аргументы по умолчанию будут использоваться в вызовах, где конечные аргументы отсутствуют.
…и функциональные параметры в Параметр декларирование может быть безымянным:
[C++11: 8.3.5/11]:
[..] Идентификатор может по выбору быть предоставлено как имя параметра. [..]
Существует даже пример такого использования в 8.3.6 / 4 (хотя примеры не являются нормативным текстом, поэтому это не может быть использовано, чтобы доказать что-либо конкретно).
Да, это совершенно законно. Очевидный пример найден в N3485 8.3.6. Аргументы по умолчанию/ 4:
[Пример: объявлениеvoid point(int = 3, int = 4);
объявляет функцию, которая может быть вызвана с нулем, одним или двумя аргументами типа int.
Да, это законно.
Произведения синтаксиса, приведенные для параметров функции в пункте 8.3.5 / 1, допускают объявление параметров без идентификатора, но с выражением присваивания (в качестве инициализатора).
Это не только законно, но и может быть весьма полезным в зависимости от вашего стиля кодирования.
Параметры по умолчанию имеют смысл только в объявлении функции.
Именованные параметры имеют смысл только в определении функции.
f.h:
void f(void*=nullptr);
f.cc
void f(void* x)
{
...
}