Declaración de tamaño de matriz C ++ y const

Solo estoy saltando en C ++, viniendo de C

En C (89/90), una const no es en realidad una constante (a diferencia de #define ‘d, enum o literal), sino más bien de solo lectura una vez que se establece. Es decir, puedo:

 const int x = rand(); 

y eso está bien, el punto que es x no se conoce hasta el tiempo de ejecución. Por lo tanto, no puedo

 int arr[x]; // error - x is not a compile-time constant 

Luego, uno de los estándares C (99?) Siguió adelante y permitió arreglos de longitud variable. Aunque normalmente codifico en contra del estándar ANSI en C, esto realmente ha tenido un impacto ahora que estoy intentando recoger C ++ 11.

Que yo sepa, C ++ no permite arreglos de longitud variable. Sin embargo, muchos comstackdores lo permiten como una extensión (GCC?). El problema es que ahora que estoy tratando de aprender C ++ 11, no puedo saber si lo que estoy codificando es válido en C ++, o C ++ extendido con compatibilidad con C99. Ex:

 std::default_random_engine e{}; std::uniform_int_distribution d{}; const int x{d(e)}; int arr[x]; // compiles 

No puedo decir si esto es válido C ++ o no. Claramente, el valor de x no se conoce hasta el tiempo de ejecución. Creo que puedo no entender la diferencia entre C y C ++ const ?

Los VLA correctos son una característica de C99 ( opcional en C11 ) y el estándar de C ++ no incluye esta característica, aunque tanto gcc como clang permiten en C ++ como una extensión. Podemos ver que no están permitidos yendo a la sección 8.3.4 Arrays de la norma C ++ 11 borrador que dice:

 D1 [ constant-expressionopt] attribute-specifier-seqopt ^^^^^^^^^^^^^^^^^^^^^^ 

Tanto para gcc como para clang usando la -pedantic se advertirá cuando esté usando una extensión. Si está apuntando a C ++ 11, también debe especificar que use -std=c++11 . Puede utilizar -pedantic-errors para convertir la advertencia en errores. Si comstack su código usando -pedantic debería ver la siguiente advertencia:

 warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[x]; // compiles ^ 

gcc documenta su soporte para varios estándares, valores predeterminados y marcas para hacer cumplir el estándar en su página de estándares de idiomas admitidos por GCC y dice:

para obtener todos los diagnósticos requeridos por el estándar, también debe especificar -pedantic (o -pedantic-errors si desea que sean errores en lugar de advertencias).

En general, clang admite lo que hace gcc pero puede encontrar más detalles en su página de compatibilidad de idiomas .

Nota como lo menciona GingerPlusPlus std: vector se considera la alternativa para VLA en C ++.