¿C++ admite Matrices de Longitud Variable?


No, espera, ten paciencia conmigo...

Las VLA siempre fueron una extensión del CCG, pero fueron adoptadas por C99:

[C99: 6.7.5.2/4]: Si el tamaño no está presente, el tipo de matriz es un tipo 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 sin embargo, los arrays son tipos completos. Si el tamaño es un entero expresión constante 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 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 en el lenguaje de programación C especificado en ISO/IEC 9899:1999 (en lo sucesivo, la norma C). Además de la instalaciones proporcionadas por C, C++ proporciona tipos de datos adicionales, clases, plantillas, excepciones, espacios de nombres, sobrecarga de operadores, nombre de función sobrecarga, referencias, operadores de gestión de tiendas libres, y servicios adicionales de biblioteca.

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

Author: M.M, 2011-12-21

4 answers

Esa redacción de margen de maniobra no significa que cualquiera y todo en C99 está en C++11. Lo que usted ha citado es solo un texto introductorio.

 15
Author: Johannes Schaub - litb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-19 00:40:48

Esta característica de C99 está efectivamente anulada por la propia semántica de C++, como puede ser cualquier otra característica "heredada":

[C++11: 8.3.4/1]: En una declaración T D donde D tiene la forma

D1 [ la expresión constanteoptar ] atributo-especificador-seqoptar

[..]

Esta es la única sintaxis de declaración de matriz que se nos da en C++.

Tenga en cuenta que ninguna mención de esta diferencia es dada en la cláusula" compatibilidad con C " C.1.

 13
Author: Lightness Races in Orbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-21 17:14:46

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

const size_t size = 5;
int array[size]; // array in C++, VLA in C
 7
Author: Happy Green Kid Naps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-21 17:49:09

Esto compila para mí: (g++ 4.6 con -std=c++0x). Pero no compila con -pedantic (gracias @ MarkB). En su lugar, advierte que " plantilla.cpp:7: 12: advertencia: ISO C++ prohíbe el array de longitud variable 'n' [- Wvla]"

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

Así que el tamaño de n no puede ser conocido en tiempo de compilación por el compilador. ¿Es una extensión de GNU para C++? Esto parece ser una extensión de GNU, y que las VLAS no son una parte oficial de C++11.

(Por supuesto, solo estoy jugando con un compilador. Tan toma esto con una pizca de sal.)

 2
Author: Aaron McDaid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-21 18:10:13