一段时间以来,人们已经能够在 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