Kir*_*rov 12 c++ aggregate-initialization
这是关于这个的第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';
}
Run Code Online (Sandbox Code Playgroud)
可以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),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数( 10.3)。
2 当聚合由初始化器列表初始化时,如 8.5.4 中所指定,初始化器列表的元素将被视为聚合成员的初始化器,按递增的下标或成员顺序。
这意味着sx首先用123初始化,然后sy用sx初始化
如果没有优化,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
Run Code Online (Sandbox Code Playgroud)
这与标准所说的一致。
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |