【问题标题】:Why is value initialization so named?为什么值初始化如此命名?
【发布时间】:2014-09-03 03:05:03
【问题描述】:

我真的不清楚为什么有人会将特定形式的初始化命名为“值初始化”。听起来好像它通过给它一个值来初始化对象......但这就是初始化通常所做的事情,并且名称并没有告诉您关于它将用于初始化的 which 值的任何信息.

【问题讨论】:

  • 这个词似乎是在N1191中首次提出的。
  • 也许它实际上确实总是给出一些合理的价值。默认初始化通常不会。

标签: c++ initialization value-initialization


【解决方案1】:

Boost value_init write-up 提供了一个相当详细的值初始化历史,它最终出现在 defect report 178: More on value-initialization 的标准中,看起来该术语起源于 defect report 35: Definition of default-initialization。尽管这些文件都没有真正提供该术语的正确来源,但它确实提供了一些好主意,但它说:

C++ 标准 (TC1) 的第一个技术勘误,其 草案于 2001 年 11 月向公众发布,引入 Core 第 178 期(当然还有许多其他问题)。

那个问题引入了值初始化的新概念(它也 修正了零初始化的措辞)。非正式地, 值初始化类似于默认初始化 在某些情况下非静态数据成员和基类的例外情况 子对象也是值初始化的。 不同之处在于, 值初始化的对象将没有(或至少更少 可能有)数据成员和基类的不确定值 子对象;与对象默认构造的情况不同。 (看 规范性描述的核心问题 178)。

为了指定对象的值初始化,我们需要使用 空集初始化器:()。

默认初始化相比,值初始化不太可能给对象留下不确定的值。

【讨论】:

  • OT,但是这个改变引入了一个恼人的问题;对于 POD struct T foo = T(); 和类似的此类语句,只能保证在 C++03 中“工作”,因此在可移植代码中,如果不冒在 C++98 编译器上运行的风险,你就无法做到这一点,并且默默地造成可怕的 UB。
  • @MattMcNabb 很不幸,有缺陷报告吗?
  • 我不知道,这只是TC1中添加的一个新东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2014-11-14
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2011-02-03
相关资源
最近更新 更多