聚合初始化与类内成员初始化的顺序

编程语言 2026-07-09
#include <iostream>
#include <print>
#include <span>
#include <vector>

struct Entry {
  std::vector<char> v;
  std::vector<char>::iterator i = v.begin();
};

int main() {
  std::vector<char> v{'a', 'b', 'c', 'd', 'e'};
  Entry e{.v = std::move(v)};
  std::print(std::cout, "{}\n", std::span(e.i, e.v.end()));
}

这个 code 按预期工作并输出

['a', 'b', 'c', 'd', 'e']

标准中,若有的话,哪一部分标准规定在进行聚合初始化时,类内初始化 .i = v.begin() 必须在 v 初始化之后完成吗?


有人可能会认为 Entry e{.v = v}; 的行为像 Entry e; e.v = v;,在 e.i 被使无效时那样。实际上,该表达式似乎更像 Entry e; e.v = v; e.i = e.v.begin()

解决方案

我将采用 N5046:

  • 9.5.2聚合体 [dcl.init.aggr]
    1. 聚合体元素的初始化是在元素顺序中进行求值

也就是说,与给定元素相关的所有值计算和副作用都会在后续元素开始之前完成。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章