Это предупреждение относится исключительно к изменению, которое произошло в том, как Visual Studio интерпретирует и компилирует этот оператор из предыдущей версии. «Изменение поведения» означает, что «если вы написали это на более старом VC ++, будьте осторожны, все изменилось». Нельзя сказать, что первый пример эквивалентен второму.
Фактически, это компилятор, соответствующий стандарту C ++. Это не предупреждение о том, что эти вещи будут эквивалентны - это предупреждение о том, что они ОДНАЖДЫ БЫЛИ, но сейчас - нет. Вы экстраполировали, что означает «инициализированный по умолчанию», неправильно.
Как правило, объект POD, который является новым для размещения, НЕ ДОЛЖЕН инициализироваться по умолчанию, поэтому это предупреждение правильно, сообщая, что () сделает это возможным. Тем не менее, это не является предупреждением против этого как такового, но, как я уже сказал, Microsoft отмечает изменение.
Std :: array гарантированно (так говорится в документации MSDN) как тип POD, если предоставленный тип - POD (например, char). Тип POD - это просто старые данные: компилятор обрабатывает их так, как если бы это был просто объект. Несмотря на то, что это класс, для него не выполняется инициализация, если он явно не вызывается, так же, как он не инициализирует стандартный указатель массива C (и фактически не может).
Давайте рассмотрим немного кода на C для некоторого освещения.
// POD version.
// buf_type = new (p) buf_type;
typedef char buf_type;
buf_type *pbuf = p; // Pointer is assigned
И
// Constructed version.
// buf_type = new (p) buf_type();
void construct_buf_type(buf_type *what);
typedef char buf_type;
buf_type *pbuf = p; // Pointer is assigned
construct_buf_type(buf_type); // Constructor is called which default-initializes it
То, что происходит за кулисами, немного отличается, но это концептуально точно , что происходит. Оба утверждения говорят компилятору разместить объект в этом месте; тот, у которого () в конце говорит ему, чтобы он вызывал конструктор по умолчанию позже.
Да, это может быть раздражающей синтаксической неоднозначностью, если вы забыли свои () в новых, когда вы пишете объекты POD. Но почти никто никогда не делает, что является частью того, почему POD часто неправильно понимают.