c++ - programas - void main definicion
Definiciones legales de main() en C++ 14 (2)
El último borrador de C ++ 14 que pude encontrar dice, con respecto a main()
[3.6.1]:
Una implementación no debe predefinir la función principal. Esta función no debe estar sobrecargada. Deberá tener un tipo de retorno de tipo int, pero de lo contrario, su tipo está definido por la implementación. Todas las implementaciones permitirán tanto
- una función de () devolver int y
- una función de (int, puntero a puntero a char) que devuelve int
y (párrafo 5)
Si el control llega al final de main sin encontrar una declaración de retorno, el efecto es el de ejecutar
return 0;
¿Significa esto que todos los siguientes son programas mínimos legales de C ++ 14? Si alguno no lo es, ¿por qué no?
-
auto main() -> int {}
-
auto main() { return 0; }
-
auto main() {}
Es legal, el segundo y el último no lo son por las siguientes razones:
El tipo de retorno de la función principal no se puede deducir desde que se aceptó CWG 1669 y la norma se volverá a redactar como:
Una implementación no debe predefinir la función principal. Esta función no debe estar sobrecargada. Tendrá un tipo de retorno declarado tipo int, pero de lo contrario, su tipo está definido por la implementación.
Esto se abrió camino en n4140. Más sobre esto: http://wg21.cmeerw.net/cwg/issue1669
Lo mismo de arriba
El primero es probablemente legal. Los otros dos ciertamente no (§7.1.6.4 / 1): "El especificador automático de tipo significa que el tipo de una variable que se está declarando se deducirá de su inicializador o que un declarador de función incluirá un tipo de retorno-trailing".
Digo probablemente por primera vez, porque §3.6.1 no está realmente claro hasta qué punto debe coincidir la definición. No se requiere una coincidencia textual al 100%, incluso si eso es lo que implicaría una interpretación literal de lo que dice: en el texto, el cuerpo de main
se da como /* ... */
, que no es muy útil , y ciertamente no es requerido. De manera similar, la tradición también ha permitido cualquier nombre para argc
y argv
, y declarar argv
como char** argv
. Sin embargo, no hay una tradición de definir main con un tipo de retorno final. Creo que lo que se quería decir en §3.6.1 es que se permitirían todas las definiciones de main
que tienen la misma firma, pero esto no es lo que dicen las palabras reales.
En cualquier caso, ¿por qué querría tal ofuscación? C / C ++ no es Pascal, y lo que es natural en un idioma (como los tipos de retorno para las funciones) es la ofuscación en otro.
EDITAR:
Acabo de descargar un borrador más reciente (N3797), y parece que la redacción ha cambiado (y ahora es contradictoria). El primer párrafo todavía dice básicamente lo mismo (pero incluye texto adicional para lambdas): el auto
se reemplaza "ya sea por deducción de un inicializador o por especificación explícita con un tipo de retorno de seguimiento". (Y, por supuesto, las fuentes no tienen inicializadores, por lo que solo se pueden aplicar los tipos de retorno-arrastre). Sin embargo, los párrafos posteriores hablan de la deducción del tipo de retorno, aunque el primer párrafo requiera el tipo de retorno por arrastre por lo tanto hace que la deducción sea superflua).