#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 в настоящее время), то по оптимизатору.