Учитывая пример кода:
struct S {
char data[5];
int a;
};
При запуске «Выполнить анализ кода» в Microsoft Visual Studio, он предупреждает об инициализации всех переменных.
Теперь я знаю, что вы можете сделать этоЕсть несколько способов создать конструктор по умолчанию, например:
S() :
data{0},
a{0} {
}
, который уберет предупреждение.Но что, если вы не хотите вручную создавать конструктор по умолчанию.
что-то вроде:
struct S {
char data[5];
int a = 0;
};
избавляется от предупреждения для a
, но не data
, хотя выможно исправить это, добавив {}
после примерно так: char data[5]{};
это, кажется, делает анализ кода счастливым.
Это заставило меня задуматься, вы также можете инициализировать a
как int a{0};
Итак, мой вопрос: все ли они действительны и какие предпочтительнее?
Примечание: я заметил, что std::array
имеет _Ty _Elems[_Size];
, который никогда нигде не инициализируется, и не имеет {}
после негоЯ полагаю, они просто игнорируют это предупреждение?Или они делают что-то, что я не замечаю, чтобы «исправить» предупреждение?
Также хотел добавить, что этот код: #include #include
template<class T, std::size_t N>
struct static_vector {
typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N] = {0};
T& operator[](std::size_t pos) {
return *std::launder(reinterpret_cast<T*>(&data[pos]));
}
};
int main(int argc, char**) {
static_vector<int, 10> s;
s[0] = argc;
return s[0];
}
в gcc9.1 -std=c++17 -Wall
не выдаетпредупреждения, но тот же код под clang8.0 -std=c++17 -Wall
дает мне:
warning: suggest braces around initialization of subobject [-Wmissing-braces]
typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N] = {0};
^
{}
Я вижу, что могу установить его на = {};
, который исправляет это, просто удивляясь, почему один компилятор выдаст предупреждение, когда другой«т?Какой из них по спецификации?