You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定初始化器中提前使用类成员是否符合C++标准?

指定初始化器中访问对象已初始化成员的合法性问题
struct Foo{
    std::string s1;
    std::string s2;
};

int main(){
    Foo f{.s1 = "s1", .s2 = f.s1 + "s2"};
    std::cout << "s1='" << f.s1 << "', s2='" << f.s2 << "'" << std::endl;
}

需要特别注意,s2的初始化过程中直接访问了对象f的第一个成员:.s2 = f.s1 + "s2"。目前最新版本的Clang、GCC和MSVC都能正常编译并运行这段代码,输出符合直觉的结果:s1='s1', s2='s1s2'。

核心问题

该代码是否合法?
换句话说,C++标准是否保证f.s1会在.s2的指定初始化器求值之前完成初始化?

相关补充

有一个类似问题询问.s2 = .s1 + "s2"是否合法,这种写法显然不合法,无法通过编译。此外,P0329提案(参考Stack Overflow相关回答)与此问题相关,但并未明确解答当前问题。

内容的提问来源于stack exchange,提问作者Sedenion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:42:38