Подтвердить что ты не робот

Visual Studio 2019 неправильно обрабатывает агрегатную инициализацию динамического массива структур

Приведенный ниже код выводит мусор (или нули), если он скомпилирован с VC++ 2017 и "1122", если скомпилирован с GCC или Clang (https://rextester.com/JEV81255). Это ошибка VC++ или я что-то здесь упускаю?

#include <iostream>

struct Item {
    int id;
    int type;
};

int main()
{
    auto items = new Item[2]
    {
        { 1, 1 },
        { 2, 2 }
    };

    std::cout << items[0].id << items[0].type;
    std::cout << items[1].id << items[1].type;
}

В то же время это работает, если элементы имеют примитивный тип (например, int).

4b9b3361

Ответ 1

Я заставил его работать, написав следующее, но тогда данные не сохраняются в куче.

Item items[] {
    { 1, 1 },
    { 2, 2 }
};

Если вам это нужно в куче, используйте приведенное ниже решение, похоже, оно работает с компилятором vc++. (Обратите внимание, что это только обходной путь, и он не устраняет основную проблему):

Item* Items[2];
Items[0] = new Item{3,3};
Items[1] = new Item{4,4};

std::cout << (*Items[0]).id << (*Items[0]).type << std::endl;
std::cout << (*Items[1]).id << (*Items[1]).type << std::endl;

В качестве альтернативы вы можете создать массив, используя первый параметр, а затем скопировать его в массив в куче следующим образом:

Item items[2]{
    {1,1},
    {2,2}
};

Item* hitem = new Item[2];
for(int i = 0; i < 2; i++){
    hitem[i].id = items[i].id + 4;
    hitem[i].type = items[i].type + 4;
}

Хотя это медленно, оно работает так, как и должно работать даже на компиляторе vc++. Вы можете просмотреть весь код здесь:https://rextester.com/VNJM26393

Я не знаю, почему это работает только так...