Подтвердить что ты не робот

Выделение функции с аргументами по умолчанию - С++ 14 vs С++ 11

Следующий код не может быть скомпилирован с версией g++ версии 5.4.0 с опцией -std=c++1y:

void f(int=0) ;

int main() {
    f(); // ok
    (*f)(2);// ok
    (*f)();// ok c++11; error with c++14: too few arguments to function
    return 0;
}

Функция объявлена ​​как аргумент по умолчанию, так что здесь не так? спасибо за помощь.

И почему компиляция g++ -c -std=c++11?

4b9b3361

Ответ 1

Принятие (*f)() как действительного является ошибкой GCC. Буква стандарта означает, что использование имени функции с унарным * должно приводить к разложению имени функции в указатель. Затем указатель должен быть разыменован для получения адреса функций для выражения вызова.

Но GCC кажется умным и опускает вышеуказанное поведение. Он рассматривает (*f) просто как f. И вызов f может быть выполнен с аргументами по умолчанию.

Однако, можно заставить GCC преформировать распад. Унарный +, примененный к имени функции, будет сильно разлагать его на указатель. Итак, следующие два:

(+f)();
(*+f)();

Вызывает GCC, чтобы испускать error: too few arguments to function в стандартной версии, в GCC 7.2 и GCC 6.3.

Ответ 2

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