问题标签 [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.
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 说,“简单类型说明符是”,然后是一个包含unsigned
and的列表int
。
因此,鉴于在 5.2.3/2 中,“simple-type-specifier”是单数的,unsigned
并且int
是两个类型说明符,那么上面使用的示例是否unsigned int
无效?(如果是这样,那么后续问题是,微软和英特尔支持上述表达方式是否不正确?)
这个问题更多是出于好奇。对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化。(这个问题是由回应这个关于初始化的问题的答案的评论提示的)。
c++ - 不可复制的对象和值初始化:g++ vs msvc
我看到 g++ 和 msvc 之间围绕值初始化不可复制对象的一些不同行为。考虑一个不可复制的类:
和一个使用值初始化的模板,这样即使类型是 POD,值也会得到一个已知值:
并尝试将它们一起使用:
从 VC++ 9.0 开始,这在 msvc 上运行良好,但在我测试过的每个 g++ 版本(包括 4.5.0 版)上都失败了,因为复制构造函数是私有的。
两个问题:
- 哪种行为符合标准?
- 关于如何在 gcc 中解决此问题的任何建议(并且要明确的是,将其更改
T t;
为不可接受的解决方案,因为这会破坏 POD 类型)。
PS 我在 boost::noncopyable 上看到了同样的问题。
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
所有字段(根据最后一点)。
那么我错在哪里?我对值初始化的解释是否正确?
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 中有缺陷的文本,这是他的回复
我认为您将“实际的构造函数调用”与概念上的构造函数混为一谈。 内置类型被认为具有构造函数(无论标准使用什么词来描述它们的行为)。
c++ - 值初始化聚合
尝试了 C++ 标准,但无法弄清楚。这些是等价的吗?
和
这些怎么样?
和
谢谢!
c++ - 在不破坏遗留代码的情况下将成员添加到现有结构
我正在使用的一些遗留代码中有以下定义。
我想向这个结构添加一个新成员:
但是,VlanData
遗留代码的使用相当不一致。
构造时未初始化:
初始化值:
我想做的是想出一种安全的方法来确保在遗留代码中自动将“mVlanPriority”设置为0,而无需更新大量代码。
我知道我可以修改遗留代码以对所有成员进行值初始化,如下所示:
但我不想更新所有这些代码。我相信创建这样的默认构造函数会有所帮助:
但这也会破坏结构的POD
-ness。
所以我想我有几个问题:
- 有没有一种安全的方法可以确保
mVlanPriority
在旧代码中将其设置为 0 而无需更新旧代码? - 如果这不再是一种
POD
类型,该类的什么用途会中断?
c++ - “值初始化”是什么意思?
例如,如果我有一堂课:
我曾经创建过一个对象,
信息旁边的括号是否意味着我正在初始化它?与此有何不同,Info *p = new Info;
?
我知道有一个问题可以区分新旧 C++ 语言中的不同含义,但我想知道默认值初始化和值初始化之间的语义差异,例如值初始化是否意味着将某些东西初始化为零?
c++ - 为什么这个简单的赋值是未定义的行为?
我正在刷新我对值初始化与默认初始化的理解,并遇到了这个:
显然这是 UB 因为
在 C() 的情况下,有一个能够初始化 x 和 y 成员的构造函数,因此不会进行初始化。因此,尝试将 C() 复制到 c 会导致未定义的行为。
我想我明白为什么,但我不确定。有人可以详细说明吗?
这是否意味着这也是UB?
顺便说一句,关于值初始化,以下是否保证为零?
c++ - 我可以在默认初始化和值初始化或全部或部分数组之间进行选择吗?
从 C++2003 开始,我们有值初始化和默认初始化。意思是:
正确的?
现在假设我有这门课
当我为 编写构造函数时Bar
,我可能希望对父类或f[]
成员进行默认或值初始化。我认为初始化父母的选择很简单:
但是f[]
会员呢?
- 如何默认初始化所有成员?
- 如何对所有成员进行值初始化?
- 如果我使用 C++11 初始化器列表,如果初始化器列表的大小与 不同,会发生什么情况
SIZE
?