指定初始化器中提前使用类成员是否符合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
相关产品推荐
相关产品推荐

