¿Admite C ++ las matrices de longitud variable?

No, espera, espera conmigo …

Los VLA siempre fueron una extensión de GCC, pero fueron adoptados por C99:

[C99: 6.7.5.2/4]: si el tamaño no está presente, el tipo de matriz es incompleto. Si el tamaño es * en lugar de ser una expresión, el tipo de matriz es un tipo de matriz de longitud variable de tamaño no especificado, que solo se puede usar en declaraciones con scope de prototipo de función; tales arreglos son, no obstante, tipos completos. Si el tamaño es una expresión constante entera y el tipo de elemento tiene un tamaño constante conocido, el tipo de matriz no es un tipo de matriz de longitud variable; de lo contrario, el tipo de matriz es un tipo de matriz de longitud variable.

C99 también se conoce como ISO/IEC 9899:1999 .

Ahora:

[C++11: 1.1/2]: C ++ es un lenguaje de progtwigción de propósito general basado en el lenguaje de progtwigción C como se especifica en ISO / IEC 9899: 1999 (en lo sucesivo, el estándar C). Además de las facilidades proporcionadas por C, C ++ proporciona tipos de datos adicionales, clases, plantillas, excepciones, espacios de nombres, sobrecarga de operadores, sobrecarga de nombres de funciones, referencias, operadores de administración de tiendas gratuitas e instalaciones de biblioteca adicionales.

Entonces, ¿no debería C ++ 11 tener VLAs también?

Esa fraseología de margen de maniobra no significa que cualquier cosa en C99 esté en C ++ 11. Lo que citó es solo texto introductorio.

Esta característica C99 es efectivamente anulada por la propia semántica de C ++, como puede ser cualquier característica de otro modo “heredada”:

[C++11: 8.3.4/1] : en una statement TD donde D tiene la forma

D1 [ expresión constante ] opt -attribute-seq opt

[..]

Esta es la única syntax de statement de matriz que se nos proporciona en C ++.

Tenga en cuenta que no se menciona esta diferencia en la cláusula C “compatibilidad con C”.

La definición de expresión constante es diferente para los dos idiomas.

 const size_t size = 5; int array[size]; // array in C++, VLA in C 

Esto comstack para mí: (g ++ 4.6 con -std=c++0x ). Pero no comstack con -pedantic (gracias @MarkB). En cambio, advierte que ” template.cpp: 7: 12: advertencia: ISO C ++ prohíbe la matriz de longitud variable ‘n’ [-Wvla]

 int main(int argc, char ** argv) { int n[argc]; } 

Por lo tanto, el comstackdor no puede conocer el tamaño de n en tiempo de comstackción. ¿Es esto una extensión de GNU a C ++? Esto parece ser una extensión de GNU, y los VLA no son una parte oficial de C ++ 11.

(Por supuesto, solo estoy jugando con un comstackdor. Así que tómalo con un poco de sal).

    Intereting Posts