Я заметил интересное поведение в GodBolt .
Я взял вам код и добавил вторую копию, где a
объявлена константой:
#include <iostream>
int foo() {
int a = -5;
int arr[a];
std::cout << "Size of arr: " << sizeof(arr) << std::endl;
return 0;
}
int bar() {
const int a = -5;
int arr[a];
std::cout << "Size of arr: " << sizeof(arr) << std::endl;
return 0;
}
Затем я бросил в них G CC, Clang и MSV C.
Насколько я знаю, G CC и Clang поддерживают массивы переменной длины (VLA) как «дополнительная функция», и они оба съели foo
без единой жалобы. Принимая во внимание, что MSV C, который не поддерживает VLA, жаловался.
С другой стороны, никто из них не принял bar
в связи с отрицательным значением a
.
Почему? G CC и Кланг не может сказать, что a
отрицательно в foo
, что я оставлю в качестве вопроса для людей, более сведущих в смелости компилятора, чем я.