问题标签 [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++ - 默认初始化和值初始化之间的歧义
我发现很多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并没有理解清楚。
这是一个例子:
正如我猜想的那样,上面是可以的,但在这里:
请帮助我了解两种初始化形式之间的主要区别。
c++ - 用作初始化程序时,空括号(“T()”)和空括号(“T{}”)有什么区别吗?
一般来说,括号和大括号是非常不同的。对于最小的可重现示例:
但是,由于空括号使用值初始化而不是std::initializer_list
构造函数,所以在用作初始化程序时,空括号和空括号有什么不同吗?
更正式地说,给定一个 type T
,是否有可能T()
和T{}
不同?(两者都可能格式不正确。)
(这个问题和答案最初是为Code Review Stack Exchange 上的C++20 标准兼容向量创建的。它的目的是让答案涵盖所有可能的情况。如果我遗漏了任何情况,请通知我。)
c++ - 在 C++ 中初始化变量的 = 和 {} 语法之间的区别
我已经阅读了很多 C++ 代码,并且遇到了两种初始化变量的方法。
方法一:
方法二:
我知道这int score {};
会将分数初始化为 0,因此也会int score = 0;
这两者有什么区别?我已阅读初始化:括号与等号,但这并不能回答我的问题。我想知道等号和花括号之间有什么区别,而不是括号。在什么情况下应该使用哪一个?
c++ - 在 C++ 中,指针类型数组的元素是否默认保证初始化为 nullptr?
如果我有这样的代码
该代码运行后是否有保证x->subnodes[0] == nullptr
?
我不是 C++ 专家,我发现 C++ 规范令人生畏。这在实践中可行,但是规范是否保证在这种情况下将 nullptr 放入数组的每个元素中(而不是说,可能是垃圾)?到目前为止,我还没有通过找到权威的规范语言来说服自己,并且在野外我看到很多代码示例似乎不相信这是真的。所以,在一段时间未能提出答案后,我转向你,堆栈溢出。提前致谢。
c++ - 为什么初始化此类时不调用列表初始化?
根据本页https://en.cppreference.com/w/cpp/language/value_initialization中描述的值初始化
如果 T 是一个没有默认构造函数但有一个构造函数采用 std::initializer_list 的类类型,则执行列表初始化。
所以我期待在下面的代码片段中初始化类时会调用Myclass(const std::initializer_list<int> &l)
,但编译器说
这是为什么?这是代码,我在 windows 上用 Mingw64 C++11 编译。
c++ - 为什么在已删除的默认 ctor 旁边定义一个空的副本 ctor 会使空列表的值初始化失败?
简而言之,为什么下面的代码表现得像评论中描述的那样?
为了理解这一点,我应该查看标准的哪一部分(或至少是 cppreference 上的一页)?
但是,写A(const A&) = default;
而不是//A(const A&) {}
不会中断A a{};
。那这个呢?我认为根本原因是一样的,但是真正了解 C++ 的人的话比我想的要好。
c++ - libstdc++ std::(multi)set/map 中是否存在 8 字节大小开销的原因?
最近我一直在分析不同标准库实现中的红黑树实现。令我感到奇怪的是,libstdc++ 似乎有不必要的大小开销。
稍微简化一下,这些类的组成如下:
Header 有 40 个字节:1 个容器的 size_type,32 个字节用于堆栈分配的哨兵节点。
现在,真正让我吃惊的是 _Rb_tree_key_compare 是如何定义的:
这样定义后,_Rb_tree_impl 不能使用空基优化,并且由于对齐要求,这意味着没有非空成员的此类(对于无状态比较器)占用 8 个字节的空间(在 x64 构建上)。
为什么不是这样定义的?
(为了清楚起见,我删除了宏和 noexcept 说明符)
根据标准(如果我理解正确的话),初始化基类的规则与初始化成员的规则大致相同,因此作为基类,它也会被值初始化。
是否有一些我失踪的原因,迫使在这里使用组合而不是继承?似乎只是在标准容器中浪费了 8 个字节,这不是我怀疑的。(我知道由于 ABI 中断,它也无法修复)。
c++ - 如何停止这个模板化函数值初始化一个新构造的对象?
如果我可以在创建新对象时为构造函数参数提供一个参数包,并且我不提供任何构造函数参数,那么结果将是:new T(); 如果它没有用户提供的构造函数,它将对对象进行值初始化。我该如何阻止这种情况发生?
c++ - 为什么`default` ctor对类成员进行零初始化?
给定两个具有不同构造函数的类:
输出是:
为什么default
ctor 零初始化int x
?
c++ - 使用 copy-list-initializer 进行 C++ 对象初始化
我得到以下结果:
实例的成员t2
不是零初始化的(我想要实现的)。我是否理解正确,如果我定义了一个构造函数,它不会执行零初始化?(我知道如何使用显式默认值实现初始化为零。问题是为什么我不能使用初始化列表来做到这一点)
列表初始化
否则,如果括号初始化列表为空并且 T 是具有默认构造函数的类类型,则执行值初始化。
值初始化
在所有情况下,如果使用空的大括号 {} 对并且 T 是聚合类型,则执行聚合初始化而不是值初始化。
聚合初始化(似乎这不是我的情况,因此它没有将成员初始化为零)
聚合是以下类型之一:
- 类类型(通常是结构或联合),具有
- 没有用户声明的构造函数
什么是遗留代码的最简单且不易出错的修改,我需要解决在初始化之前使用某些类成员的问题?