【发布时间】:2019-02-16 08:01:17
【问题描述】:
一段时间以来,人们已经能够在 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
【问题讨论】:
-
即使使用
-pedantic-errors -std=c++2a,我也可以在 GCC 8.1 上进行复制。呵呵。 -
对我来说似乎是个错误。
-
如果你在初始化器前加上
=有什么变化吗? -
我认为你只是在矩阵上撕开了一个洞。你是尼奥吗?
-
@Cale:在这种情况下,没有矩阵 ...它只是一个 GCC 扩展 ;)
标签: c++ g++ language-lawyer c++20 designated-initializer