vectores una tipos programacion matriz matrices llenar ingresar imprimir funciones ejemplos datos con como caracteres arreglos c++ c++11 variable-length-array

una - ¿Admite C++ las matrices de longitud variable?



tipos de arreglos en c++ (4)

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 alcance 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 programación de propósito general basado en el lenguaje de programació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 declaración TD donde D tiene la forma

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

[..]

Esta es la única sintaxis de declaración 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".


Esto compila para mí: (g ++ 4.6 con -std=c++0x ). Pero no compila 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 compilador no puede conocer el tamaño de n en tiempo de compilació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 compilador. Así que tómalo con un poco de sal).


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