Я считаю, что современным C++ списки инициализатора очень полезен для инициализации объектов, до точки устранения необходимости для определения своего собственного конструктора:Включить стандартный список инициализатора конструктора
struct point
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // nice !
Однако, это не работает, когда мои класс наследует от другого класса:
template<typename T>
class serializable
{
protected:
serializable() = default;
...
// other stuff
}
struct point : public serializable<point>
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // Doesn't work :(
Я попытался добавить point() = default;
к моей точке класса, но это не сработало. Как я могу инициализировать точку с помощью списка инициализаторов?
благодарственным для вас четкого и подробного ответа. Это оправдывает меня, почему стандарт такой. Я предполагаю, что это потому, что конструктор s иначе не будет называться ... и, возможно, в некоторых случаях они могут быть связаны между конструкторами и инициализацией списка. Однако, поскольку все конструкторы являются '= default', которые не должны вызывать никаких проблем – Amxx
@Amxx Что делать, если базовые классы имели членов? Что делать, если эти члены по умолчанию являются конструктивными? Непонятно, что «правильная вещь» делать во всех этих случаях - поэтому стандарт предпочитает не догадываться. – Barry
Вы также можете наполнить свои данные членом или базовым классом, например 'struct point_data {float coord [3]; } ', тогда есть« идеальный конструктор переадресации », который создает' {} 'основанную на нем конструкцию. – Yakk