Запрет на использование функций с передачей "по значению" в качестве типов параметров при объявлении функций.

Никита Колотов
Никита Колотов

С давних времен в С и С++ имеется специальное правило, по которому параметры функций с типом функция T на деле получают тип указатель на T: [dcl.fct] 11.3.5 Functions 5 ... After determining the type of each parameter, any parameter of type “array of T” or of function type T is adjusted to be “pointer to T”. C параметрами-функциями сложностей меньше, чем с параметрами-массивами, но они тоже зачастую приводят к различным проблемам:
1. игнорирование опциональности такого параметра:

void foo(int bar(int))
{
    cout << bar(2); // fail
}
...
foo(nullptr);

2. неочевидная невозможность задать const квалификатор для такого параметра чтобы соблюсти const-correctness:

using action_t = int (int);

void test(action_t const action) // const is not applied to pointer
{
    action = 0; // wat
}

3. могут иметь место расхождения между объявлениями функции  и / или ее определением, создавая неразбериху:

using action_t = int (int);

void test(action_t action);
void test(action_t * p_action); // same as above

4. дополнительные сложности в случае с most vexing parse:

int x(int()); // парсится не как переменная x, а как объявление функции
...
x = 4; // компилятор сообщит об ошибке тут, а не в месте некорректного объявления x

Соответственно я предлагаю это правило заменить на прямой запрет таких действий: If function has parameter of type “function T” the program is ill-formed.

3
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения