2012-06-26 26 views

Respuesta

11

No. En un C portátil puro ++ programa, el argumento argv, si está presente, no tiene const modificadores.

Editar: Véase la sección 3.6.1.2 del borrador de la norma C++ 11, que (en la versión que tengo delante de mí) afirma:

Una implementación no predefinir la función principal. Esta función no se sobrecargará. Tendrá un tipo de devolución de tipo int, pero ; de lo contrario, su tipo está definido por la implementación. Todas las implementaciones permitirán ambas de las siguientes definiciones de principal:

int main(){ /*...*/ }

y

int main(int argc, char* argv[]) { /* ... */ }

3

depende de lo que quiere decir con portátil. Una implementación malvada de C++ podría rechazarla con el argumento de que su firma, int(int,char const*const*), es diferente de una de las firmas permitidas requeridas, int() y int(int,char**). (Una implementación podría parecer mal rechace auto main(int argc,char* argv[]) -> int o, de hecho, cualquier definición de main donde el cuerpo no es { /* ... */ })

Sin embargo esto no es típico. No sé de ninguna implementación en la que agregar un const cause un problema al llamar al main, y dado que C++ 11 agregó el bit sobre tipos 'similares' no violarás la regla del alias estricto al acceder a un objeto char** a través de char const * const * variable.

De modo que si bien una implementación conforme podría técnicamente rechazarla, creo que será portátil para cualquier implementación que pueda interesarle usar.

+0

Gosh, no me di cuenta de que agregar tipos similares a los alias legales tenía como objetivo habilitar las funciones cuyos argumentos suministrados y parámetros formales tenían tipos erróneos ;-) Pero sí, probablemente solo funcione (TM). –

+0

@SteveJessop No está diseñado para habilitar eso, y de hecho no lo habilita en general porque agregar 'const' a un parámetro formal afectará el cambio de nombre. La razón por la que esto funciona para 'main' es porque' main' está típicamente exento de manipulación (porque de todos modos no se permite sobrecargar el main). La adición de tipos similares solo significa que no obtiene automáticamente un comportamiento indefinido por violar la regla de aliasing estricta cuando accede a 'char **' como 'char const * const *'. Funcionó bien antes de C++ 11 en todas las implementaciones que conozco, pero técnicamente era UB. Ahora no debería ser UB – bames53

+3

¿Tiene una cita fuente o estándar en 'auto main (int argc, char * argv []) -> int' siendo una firma diferente? Es 'int main (int argc, char ** argv)' ¿no también una firma diferente entonces? –

Cuestiones relacionadas