如果未显式定义非 POD 常量,为什么会编译以下内容?
Why does the following compile if the non-POD constant isn't explicitly defined?
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。
必须以有意义的值初始化成员变量,因为该程序之后无法更改它们。这就是要求初始化器的基本原理。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么 gcc 编译这个而 msvc 没有
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 编译 llvm 3.1 时,为什么会出现错误:在">"标记之前预期主表达式
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 为什么下面的模板化类成员函数无法编译?
- 为什么通过指针编译时不能分配 const 初始化
- 如果我的手机是 ARMv8,为什么 Android Studio 会C++编译为 ARMv7?
- 为什么传递非静态成员函数会导致编译错误?
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 为什么使用EnTT进程无法编译
- 为什么许多项目不提供预编译的二进制文件?
- 包含 std::forward 会产生错误,但其省略会编译.为什么
- 我相信 -O2 标志导致我不得不在每台机器上重新编译.为什么
- clang 在 Coliru 中编译此代码段,但不在编译器资源管理器中编译.为什么