Мне просто интересно, почему это работает в Clang 4.0:
unsigned cnt = 42;
int k[cnt];
Но это не будет
unsigned cnt = 42;
string bad[cnt];
Я только что проверил праймер C ++ 5-е издание. Это говорит о том, что:
измерение должно быть известно во время компиляции, что означает, что
размерность должна быть постоянным выражением
Если это правда, почему int k[cnt];
Работа?
Ни один фрагмент не работает в C ++.
Однако в C можно использовать неконстантные выражения в качестве размеров массива. Некоторые компиляторы (например, GCC без -pedantic
опция) поддерживает эту функцию C в коде C ++.
Что касается различия между типами элементов, это зависит от компилятора. GCC компилирует оба. Clang ++ запрещает не POD-типы (такие как std::string
) в этом случае.
Какой компилятор вы используете, я использую gcc, и как const, так и nonconst работает нормально.
Это не вопрос c, массивы не предназначены для определения с помощью переменных, только макросы и выражения const.
Это вопрос интерпретации компилятора, я сомневаюсь, что это связано со стандартами.
Является ли Clang 4.0 на самом деле Apple XCode Clang? я думаю, что это на самом деле версия 3.1. Clang предлагает хорошее объяснение:
warning: variable length arrays are a C99 feature
[-Wvla-extension]
int k[cnt];