为何C++20下该std::make_unique结构体初始化代码可编译?
问题原因解析
你的代码能通过g++ --std=c20编译但在--std=c2a下失败,核心原因有两点:
c2a与c20的本质区别
GCC里的--std=c2a是C20标准正式发布前的草案测试版本代号,对应早期未完全实现所有C20特性的编译器版本;而--std=c20是C20标准定稿后,GCC提供的对应最终标准的编译选项,包含所有已实现的C20正式特性。涉及的C++20特性:聚合类型的圆括号初始化支持
你代码里的std::make_unique<Something>(0, 1)能正常工作,依赖的是C20中允许聚合类型使用圆括号进行初始化的特性(对应提案P0960R3)。在C20之前,聚合类型(比如你的Something结构体)只能用花括号{}做聚合初始化,无法像非聚合类那样用圆括号()传递多个参数初始化;C++20正式引入该特性后,std::make_unique可以将参数完美转发,用圆括号完成聚合类型的初始化。这个特性在GCC的C++特性支持列表里对应的条目是*"Allow initializing aggregates from a parenthesized list of values (P0960R3)"*,你之前可能没定位到。由于
c2a对应的早期草案版本还未实现或默认启用该特性,因此编译失败;而--std=c20对应的正式版本已完整支持该特性,所以编译通过。
内容的提问来源于stack exchange,提问作者Kitswas
相关产品推荐
相关产品推荐

