【问题标题】:Is a member initialization list without a value defined? [duplicate]成员初始化列表是否没有定义值? [复制]
【发布时间】:2021-09-19 01:25:47
【问题描述】:

说我有:

class Foo
{
public:
  int x;
  Foo() : x() {}
} 

在构造函数运行后读取x会是UB吗?更具体地说,这是什么类型的初始化,零初始化、直接初始化还是默认初始化?

我知道如果我们可以:

Foo() : x(42) {}

x 将直接初始化为42,但我不太确定上面的 sn-p,如果事实证明这是默认初始化的,我不想被 UB 狼咬.

【问题讨论】:

  • 难道不是zero-initialization"作为非类类型和没有构造函数的值初始化类类型成员的值初始化序列的一部分,包括值初始化没有为其提供初始化器的聚合元素。""如果 T 是标量类型,则对象的初始值是显式转换为 T 的整数常量零。"?
  • @NathanOliver 感谢复制,不知道为什么我没有找到。
  • @HattedRooster 没问题。 FWIW,我搜索了 空括号在成员初始化程序 c++ 中的含义 以找到它。目标是第一个结果。

标签: c++ initialization language-lawyer c++20 member-initialization


【解决方案1】:

这是什么类型的初始化

x() 执行value-initialization

当使用带有空括号or braces (since C++11)的成员初始化程序初始化非静态数据成员或基类时;

作为非类类型intx最后被零初始化为0

  1. 否则,对象被零初始化。

【讨论】:

  • 所以内存初始化列表不会改变语法,这将是值初始化,我明白了。
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2012-10-24
相关资源
最近更新 更多