Некоторое время теперь в GCC можно было использовать "назначенный инициализатор":
struct CC{
double a_;
double b_;
};
CC cc{.a_ = 1., .b_ = 2.}; assert(cc.a_ == 1. and cc.b_ == 2.); // ok
CC cc{.bla = 0., .bli = 0.}; // compile error
Однако, когда я добавляю конструктор, метки игнорируются.
struct CC{
double a_;
double b_;
CC(double a, double b) : a_{a}, b_{b}{}
};
CC cc{.a_ = 1., .b_ = 2.}; assert(cc.a_ == 1. and cc.b_ == 2.); // ok
CC cc{.b_ = 2., .a_ = 1.}; // compiles but labels don't matter only the order, confusing
CC cc{.bla = 2., .bli = 1.}; // compiles but labels don't matter, confusing
Другими словами синтаксис инициализатора с конструктором делает ярлык вести себя как комментарий !, что может быть очень запутанным, но, прежде всего, очень странно.
Я обнаружил это случайно, с gcc 8.1 -std=c++2a
.
Это ожидаемое поведение?
Ссылка: https://en.cppreference.com/w/cpp/language/aggregate_initialization