如果未显式定义非 POD 常量,为什么会编译以下内容?

Why does the following compile if the non-POD constant isn't explicitly defined?

本文关键字:编译 为什么 定义 常量 POD 如果      更新时间:2023-10-16

i的印象是,所有const成员都必须由构造函数明确初始化,但是在测试后,似乎只能初始化POD类型。以下编译不管是否在构造函数中提及b

#include <string>
struct A {
    const int a;
    const std::string b;
    A() : a{} {}
};

示例:http://cpp.sh/36my2

c 14 [dcl.init]/7:

如果程序要求使用CONSCELIFIED类型T的对象的默认初始化,则T应为具有用户提供的默认构造函数的类类型。

在这种情况下,不提供对象的初始化器是"呼吁默认初始化"。"用户提供的默认构造函数"意味着有一个可以用零参数调用的构造函数,并且该构造函数未设置为=default;

std::string类实际上确实具有用户提供的默认构造函数。因此,此规则可防止您省略a{},但它不会迫使您为b提供任何初始化器。

std::string有一个用户提供的默认构造函数,因此默认构造b将使其具有"有意义的"值(它将是一个空字符串)。因此,构造函数可以隐式初始化它。

int是一种易于构造的类型。它的默认构造函数绝对没有任何作用,因此a的内容是不确定的,除非在成员初始化器列表中明确初始化。列表初始化(使用括号{}a将在其上进行预成形值初始化,并最终将其定义为0。

必须以有意义的值初始化成员变量,因为该程序之后无法更改它们。这就是要求初始化器的基本原理。

相关文章: