Проблема с инициализацией структуры с помощью нового оператора

#c #c 11 #new-operator

#c #c 11 #new-operator

Вопрос:

Ниже приведены два варианта моей программы

 struct customer{
    char fullname[35];
    double payment;
};

int main()
{
    customer alex{"Alex", 15};
    return 0;
}
  

 struct customer{
    char fullname[35];
    double payment;
};

int main()
{
    customer* alex = new customer {"Alex", 15};
    return 0;
}
  

Первый работает нормально, но второй вызывает проблемы error:could not convert '{"Alex", 15}' from 'brace-enclosed initializer list' to 'customer' . В чем проблема?

Комментарии:

1. Как вы это скомпилировали?

2. Я не могу вспомнить, на каком этапе использовалось {...} для вызова конструктора (думал, что это C 11, но, возможно, это был C 14?)… вы можете попробовать заключить список инициализаторов в круглые скобки: customer* alex = new customer( {"Alex", 15} ); чтобы соответствовать «старому» синтаксису.

3. Я использую eclipse IDE (компилятор MinGW)

4. новый клиент ({«Alex», 15}); не работает

5. У вас нет конструктора, который будет принимать два параметра, что создает путаницу. Вы вызываете конструктор по умолчанию без параметров.

Ответ №1:

Я думаю, что код в порядке, но некоторые компиляторы могут жаловаться.

Попробуйте вместо этого:

 customer* alex = new auto(customer{"Alex", 15});
  

Комментарии:

1. это создает объект в стеке, а затем вызывает конструктор копирования, не так ли?

2. @0x476f72616e Конструктор перемещения, но тривиальные структуры будут создаваться непосредственно в выделенной памяти. Если не по правилам языка (по одному из многих решений, которые есть в C в настоящее время), то по оптимизатору.