【发布时间】:2021-05-28 08:40:13
【问题描述】:
下面的程序使用 gcc 编译并运行,没有警告:
#include <iostream>
struct A { int a, b; };
int main() {
A x = {.a = 42, .b = x.a}; // <-- b is initialized from x.a
std::cout << x.a << ' ' << x.b << std::endl;
}
42 42
x 本质上是在其初始化期间使用的。这对于 .a 由大型表达式初始化的情况非常方便。
这是 C++ 中的合法表达式吗?我能保证总是得到正确的答案吗?
【问题讨论】:
-
AFAIK 指定的初始值设定项是 C++20 中的新元素,因此您的 c++17 标记似乎不适用。
-
我认为它会起作用,因为 当前对象的成员按其自然顺序初始化,除非使用指示符, 我认为这意味着除非指示符更改顺序.所以在你的情况下,只要
.a = 42先发生,然后.b = x.a就可以了。 -
如果是 UB,他们会禁止它....不确定我会假设,一般来说。 :)
-
@Kostas:C++ 在 C++20 之前没有指定初始化器,尽管在那之前有几个 编译器 允许它。
-
Kostas: "如果你这样做
A x = {.b = 5, .a = x.b};你会得到一个错误。" - 这是 C++ 中的错误,而不是 C 中的错误。(当同时存在 C和 C++ 标记)
标签: c++ initialization language-lawyer