这是关于此的第 n 个问题,但我找不到完全相同的重复项...
假设如下代码:
#include <iostream>
struct S {
int x;
int y;
};
class C {
public:
S s;
C() : s{123, s.x} {}
};
int main() {
std::cout << C().s.y << '\n';
}
这样初始化s.y
可以吗? (只有 JetBrains 的 ReSharper 用以下方式提示它:Object member this->s.x might not be initialized
)。
如果有人用标准的引用来确认他们的答案,那就太好了。
最佳答案
来自 C++14
8.5.1 聚合 [dcl.init.aggr]
1 聚合是一个数组或一个类(第 9 条),没有用户提供的构造函数(12.1),没有私有(private)或 protected 非静态数据成员(第 11 条),无基类(第 10 条),无虚函数(10.3)。
2 当聚合被初始化列表初始化时,如 8.5.4 中所指定,初始化列表的元素 以递增的下标或成员顺序作为聚合成员的初始值设定项。
这意味着s.x首先用123初始化,然后s.y用s.x初始化。
没有优化,GCC 6.3 生成
C::C():
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov rax, QWORD PTR [rbp-8] # read address of s
mov DWORD PTR [rax], 123 # write 123 to s.x (offset 0 from s)
mov rax, QWORD PTR [rbp-8] # read address of s again
mov edx, DWORD PTR [rax] # read contents of s.x to edx
mov rax, QWORD PTR [rbp-8] # read address of s
mov DWORD PTR [rax+4], edx # write s.y (offset 4 from s)
nop
pop rbp
ret
这与标准所说的一致。
关于c++ - 结构的聚合初始化,使用它自己的数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43234115/