compiler - Desreferenciación de una función con argumentos predeterminados: C++ 14 vs C++ 11
c++11 download (2)
El siguiente código no puede compilarse con g ++ versión 5.4.0 con la opción -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;
}
La función declaró tener un argumento por defecto, entonces, ¿qué está mal aquí? gracias por la ayuda.
¿Y por qué g++ -c -std=c++11
?
Aceptar (*f)()
como válido es un error de GCC. La letra del estándar indica que el uso de un nombre de función con unario *
debería hacer que el nombre de la función se descomponga en un puntero. El puntero se debe anular para obtener la dirección de las funciones de la expresión de llamada.
Pero GCC parece inteligente, y omite el comportamiento anterior. Se trata (*f)
simplemente como f
. Y llamando a f
se puede hacer con los argumentos por defecto.
Sin embargo, uno puede obligar a GCC a realizar la descomposición. Unario +
aplicado en el nombre de la función lo convertirá en un puntero a la fuerza. Así que los dos siguientes:
(+f)();
(*+f)();
Causa que GCC emita un error: too few arguments to function
en cualquiera de las revisiones estándar, tanto en GCC 7.2 como en GCC 6.3 .
Los argumentos predeterminados no son parte del tipo de función, por lo que se descartan cuando se convierte implícitamente la función en puntero de función y luego se señala indirectamente ese puntero.