Следующий код запускает C4345 на отмеченной строке:
#include <array>
#include <iostream>
int main(){
static unsigned const buf_size = 5;
typedef std::array<char, buf_size> buf_type;
char buf[] = { 5, 5, 5, 5, 5 };
void* p = &buf[0];
buf_type* pbuf = new (p) buf_type(); // <=== #10
for(unsigned i=0; i < buf_size; ++i)
std::cout << (char)((*pbuf)[i] + 0x30) << ' ';
}
main.cpp(10): предупреждение C4345: изменение поведения: объект типа POD, построенный с инициализатором формы(), будет инициализирован по умолчанию
Итак, согласно их предупреждению, строка 10 должна иметь такое же поведение, как если бы оно было написано как
buf_type* pbuf = new (p) buf_type; // note the missing '()'
Однако выход отличается. А именно, первая версия будет печатать пять 0
s, а вторая версия будет печатать пять 5
s. Таким образом, первая версия действительно инициализируется инициализацией (и базовый буфер с нулевой инициализацией), хотя MSVC говорит, что это не будет.
Можно ли это считать ошибкой в MSVC? Или я неверно истолковал предупреждение/неисправен мой тестовый код?