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

结构体构造函数与聚合类型互斥?代码返回语句解析

聚合类型与特殊初始化写法的疑问解析

先看你给出的代码:

#include <iostream>
#include <string>
#include <optional>

struct Aggregate  {
    int age;
    std::string name;
};

std::optional<Aggregate> MakeOne() {
    return Aggregate({.name = "Abc"});
};

int main()
{
    auto person = MakeOne();
    
    std::cout << "Age: " << person.value().age << std::endl;

    return 0;
}

你疑惑的Aggregate({.name = "Abc"})并不是调用构造函数,而是C++20引入的聚合体指定初始化语法,本质还是聚合初始化,和聚合类型不能有构造函数的规则完全不冲突——你的Aggregate确实是标准定义的聚合类型。

关键细节说明:

  • 聚合类型的判定:Aggregate结构体没有用户声明的构造函数、私有/保护非静态成员、基类或虚函数,完全符合C++聚合体的定义,所以它是聚合类型。
  • 指定初始化器的功能:{.name = "Abc"}是C++20新增语法,允许精准初始化聚合体的特定成员,未被指定的成员会自动执行值初始化:比如代码里的age是int,会被初始化为0;类类型成员(如std::string)则会默认初始化。
  • 该写法的本质:Aggregate({.name = "Abc"})是显式创建聚合体实例的语法,等价于Aggregate{.name = "Abc"},属于聚合初始化的变体。因为聚合体没有用户定义的构造函数,这里的括号并不是构造函数调用,只是C++允许的聚合初始化语法形式。

运行代码时,age的输出为0,正好验证了未指定成员的初始化规则;name则被正确设置为"Abc"。

内容的提问来源于stack exchange,提问作者Rustam A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:07