问题标签 [value-initialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1920 浏览

c++ - 显式类型转换和多个简单类型说明符

要初始化一个类型的对象T,可以按照以下方式之一做一些事情:

我的问题涉及由简单类型说明符组合指定的类型,例如unsigned int

Visual C++ 2008 和 Intel C++ Compiler 11.1 接受这两者,不会发出警告;Comeau 4.3.10.1b2 和 g++ 3.4.5(诚然,这不是最近的)没有。

根据 C++ 标准(C++03 5.2.3/2,expr.type.conv):

表达式T(),其中T是非数组完整对象类型或(可能是 cv 限定的)void类型的简单类型说明符(7.1.5.2),创建指定类型的右值,它是值初始化的

7.1.5.2 说,“简单类型说明符是”,然后是一个包含unsignedand的列表int

因此,鉴于在 5.2.3/2 中,“simple-type-specifier”是单数的,unsigned并且int是两个类型说明符,那么上面使用的示例是否unsigned int无效?(如果是这样,那么后续问题是,微软和英特尔支持上述表达方式是否不正确?)

这个问题更多是出于好奇。对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化。(这个问题是由回应这个关于初始化的问题的答案的评论提示的)。

0 投票
4 回答
1440 浏览

c++ - 不可复制的对象和值初始化:g++ vs msvc

我看到 g++ 和 msvc 之间围绕值初始化不可复制对象的一些不同行为。考虑一个不可复制的类:

和一个使用值初始化的模板,这样即使类型是 POD,值也会得到一个已知值:

并尝试将它们一起使用:

从 VC++ 9.0 开始,这在 msvc 上运行良好,但在我测试过的每个 g++ 版本(包括 4.5.0 版)上都失败了,因为复制构造函数是私有的。

两个问题:

  1. 哪种行为符合标准?
  2. 关于如何在 gcc 中解决此问题的任何建议(并且要明确的是,将其更改T t;为不可接受的解决方案,因为这会破坏 POD 类型)。

PS 我在 boost::noncopyable 上看到了同样的问题。

0 投票
2 回答
5292 浏览

c++ - 值初始化和非 POD 类型

一小时前,我在这里发布了一个答案,据我所知是正确的。然而,我的回答被Martin B否决了。他说

你很幸运并且得到了零,因为我放置的内存恰好是零初始化的。标准不保证这一点。

但是,在阅读了 Michael Burr 的答案并尝试了以下示例代码之后

1)

我在 MSVC++ 2010 上遇到了调试错误。

当我在 MSVC++2010 上尝试以下代码 [My answer here ]时,我遇到了类似的错误

2)

在 gcc/Clang 上既没有(1)也没有(2)给出任何这样的错误,这让我想到 MSVC++2010 是否不支持 C++03。我不知道。

根据 Michael Burr 的帖子 [in C++03]

new B() - 对 B 进行值初始化,将所有字段初始化为零,因为它的默认 ctor 是编译器生成的,而不是用户定义的。

标准说

对 Tmeans 类型的对象进行值初始化:

— 如果 T 是具有用户声明的构造函数 (12.1) 的类类型(第 9 条),则调用 T 的默认构造函数(如果没有可访问的默认构造函数,则初始化是错误的);

......

否则,对象被零初始化

从第一点开始,如果没有用户声明的默认构造函数,则将调用编译器合成的默认构造函数,这将调用zero initialize所有字段(根据最后一点)。

那么我错在哪里?我对值初始化的解释是否正确?

0 投票
3 回答
597 浏览

c++ - Ideone 和 Codepad 真的不支持 C++03 吗?

我的问题与Prasoon关于非 POD 类型和值初始化的问题有关。

我在 Ideone 和 Codepad 等在线编译器上尝试了以下代码,但可执行文件在两个站点上都出现了运行时错误。

Ideone在此处
输出 键盘在此处输出

这是否意味着它们都不支持 C++03 值初始化功能?

0 投票
3 回答
20613 浏览

c++ - 内置类型有默认构造函数吗?

读完这篇文章后,我提出了一个int ()产生 0 的观点,因为临时int是值初始化的,而不是因为int()调用了int. (根据我的理解,这篇文章有缺陷。)

我还说过原始(内置)类型没有构造函数。原作者让我检查第 10.4.2 节(TC++PL),上面写着

内置类型也有默认构造函数($6.2.8)

但我仍然认为“C++ 甚至允许内置类型(原始类型)具有默认构造函数”这句话。有缺陷(根据 C++03)。

我认为 TC++PL 中的 Bjarne 将“像符号 ie 一样的构造函数()”与实际的构造函数调用混为一谈。Bjarne 在写这本书的时候并没有引入值初始化,对吧?那么根据 C++98 和 C++03,TC++PL 中的文本是否不正确?

你们有什么感想?

编辑

我亲自(通过邮件)向 Bjarne 询问了 TC++PL 中有缺陷的文本,这是他的回复

我认为您将“实际的构造函数调用”与概念上的构造函数混为一谈。 内置类型被认为具有构造函数(无论标准使用什么词来描述它们的行为)。

0 投票
2 回答
288 浏览

c++ - 值初始化聚合

尝试了 C++ 标准,但无法弄清楚。这些是等价的吗?

这些怎么样?

谢谢!

0 投票
3 回答
1444 浏览

c++ - 在不破坏遗留代码的情况下将成员添加到现有结构

我正在使用的一些遗留代码中有以下定义。

我想向这个结构添加一个新成员:

但是,VlanData遗留代码的使用相当不一致。

构造时未初始化:

初始化值:

我想做的是想出一种安全的方法来确保在遗留代码中自动将“mVlanPriority”设置为0,而无需更新大量代码。

我知道我可以修改遗留代码以对所有成员进行值初始化,如下所示:

但我不想更新所有这些代码。我相信创建这样的默认构造函数会有所帮助:

但这也会破坏结构的POD-ness。

所以我想我有几个问题:

  1. 有没有一种安全的方法可以确保mVlanPriority在旧代码中将其设置为 0 而无需更新旧代码?
  2. 如果这不再是一种POD类型,该类的什么用途会中断?
0 投票
1 回答
13473 浏览

c++ - “值初始化”是什么意思?

可能重复:
以下短语在 C++ 中是什么意思:零、默认和值初始化?

例如,如果我有一堂课:

我曾经创建过一个对象,

信息旁边的括号是否意味着我正在初始化它?与此有何不同,Info *p = new Info;?

我知道有一个问题可以区分新旧 C++ 语言中的不同含义,但我想知道默认值初始化和值初始化之间的语义差异,例如值初始化是否意味着将某些东西初始化为零?

0 投票
3 回答
361 浏览

c++ - 为什么这个简单的赋值是未定义的行为?

我正在刷新我对值初始化与默认初始化的理解,并遇到了这个

显然这是 UB 因为

在 C() 的情况下,有一个能够初始化 x 和 y 成员的构造函数,因此不会进行初始化。因此,尝试将 C() 复制到 c 会导致未定义的行为。

我想我明白为什么,但我不确定。有人可以详细说明吗?

这是否意味着这也是UB?

顺便说一句,关于值初始化,以下是否保证为零?

0 投票
1 回答
122 浏览

c++ - 我可以在默认初始化和值初始化或全部或部分数组之间进行选择吗?

从 C++2003 开始​​,我们有值初始化和默认初始化。意思是:

正确的?

现在假设我有这门课

当我为 编写构造函数时Bar,我可能希望对父类或f[]成员进行默认或值初始化。我认为初始化父母的选择很简单:

但是f[]会员呢?

  • 如何默认初始化所有成员?
  • 如何对所有成员进行值初始化?
  • 如果我使用 C++11 初始化器列表,如果初始化器列表的大小与 不同,会发生什么情况SIZE