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

Является ли следующий код допустимым в C ++?

void f(void* = 0)
{}

int main()
{
f();
}

На какой странице стандарта C ++ указано, что это использование разрешено?

11

Решение

Да, это законно.

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

Синтаксис аргумента по умолчанию применяется к параметрам функции в Параметр декларирование:

[C++11: 8.3.6/1]: Если инициализатор-раздел указан в Параметр декларирование этот инициализатор-раздел используется в качестве аргумента по умолчанию. Аргументы по умолчанию будут использоваться в вызовах, где конечные аргументы отсутствуют.

…и функциональные параметры в Параметр декларирование может быть безымянным:

[C++11: 8.3.5/11]: [..] Идентификатор может по выбору быть предоставлено как имя параметра. [..]

Существует даже пример такого использования в 8.3.6 / 4 (хотя примеры не являются нормативным текстом, поэтому это не может быть использовано, чтобы доказать что-либо конкретно).

12

Другие решения

Да, это совершенно законно. Очевидный пример найден в N3485 8.3.6. Аргументы по умолчанию/ 4:

[Пример: объявление

void point(int = 3, int = 4);

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

12

Да, это законно.
Произведения синтаксиса, приведенные для параметров функции в пункте 8.3.5 / 1, допускают объявление параметров без идентификатора, но с выражением присваивания (в качестве инициализатора).

1

Это не только законно, но и может быть весьма полезным в зависимости от вашего стиля кодирования.

Параметры по умолчанию имеют смысл только в объявлении функции.

Именованные параметры имеют смысл только в определении функции.

f.h:

void f(void*=nullptr);

f.cc

void f(void* x)
{
...
}
0
По вопросам рекламы [email protected]