Czy C++ obsługuje tablice o zmiennej długości?

Nie, czekaj, wytrzymaj ze mną...

VLAs zawsze były rozszerzeniem GCC, ale zostały przyjęte przez C99:

[C99: 6.7.5.2/4]: Jeśli rozmiar nie jest obecny, typ tablicy jest niekompletny Typ. Jeśli rozmiar jest * zamiast wyrażenia, Typ array to typ tablicy o zmiennej długości o nieokreślonym rozmiarze, który mogą być używane tylko w deklaracjach z zakresem prototypu funkcji; takie tablice są jednak kompletnymi typami. Jeśli rozmiar jest liczbą całkowitą wyrażenie stałe i Typ elementu ma znaną stałą wielkość, typ tablicy nie jest typem tablicy o zmiennej długości; w przeciwnym razie, typ tablicy jest typem tablicy o zmiennej długości.

C99 jest również znany jako ISO/IEC 9899:1999.

Teraz:

[C++11: 1.1/2]: C++ jest językiem programowania ogólnego przeznaczenia opartym na w języku programowania C określonym w ISO/IEC 9899:1999 (zwana dalej normą C). Oprócz obiekty dostarczane przez C, C++ dostarcza dodatkowe typy danych, klasy, szablony, wyjątki, przestrzenie nazw, przeciążenie operatora, nazwa funkcji przeciążenia, referencje, bezpłatne zarządzanie sklepem i dodatkowe wyposażenie biblioteki.

czy C++11 też nie powinno mieć VLAs?

Author: M.M, 2011-12-21

4 answers

To swobodne sformułowanie nie oznacza, że wszystko i wszystko w C99 jest w C++11. To, co zacytowałeś, to tylko tekst wprowadzający.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-19 00:40:48

C99 może być również używany w C++, ale nie może być używany w C++, ponieważ nie może być używany w C++.]}

[C++11: 8.3.4/1]: w deklaracji T D Gdzie D ma postać

D1 [ stała-wyrażenieopt ] atrybut-specifier-seqopt

[..]

Jest to jedyna składnia deklaracji array, którą otrzymujemy w C++.

Zauważ, że żadna wzmianka o tej różnicy nie jest podane w klauzuli "zgodność Z 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 17:14:46

Definicja wyrażenia stałego jest inna dla obu języków.

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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 17:49:09

To kompiluje dla mnie: (g++ 4.6 z -std=c++0x). Ale nie kompiluje się z -pedantic (dzięki @ MarkB). Zamiast tego ostrzega, że " szablon.cpp: 7: 12: warning: ISO C++ forbids variable length array ' n ' [- Wvla]"

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

Tak więc rozmiar n nie może być znany w czasie kompilacji przez kompilator. czy jest to rozszerzenie GNU do C++? to wydaje się być rozszerzeniem GNU, i że VLAs nie są oficjalną częścią C++11.

(oczywiście, po prostu bawię się kompilatorem. Więc weź to ze szczyptą soli.)

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 18:10:13