问题标签 [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++14 中的聚合类型进行值初始化?
这被视为聚合初始化,它会为未初始化的Aggregate_t
.
这可能吗?
编辑:例子
使用 g++-4.9.2 编译:
c++11 - 如何确保你的对象是零初始化的?
更新:我正在寻找是否有一种方法可以一次将整个类初始化为零,因为从技术上讲,人们可能会忘记在每个成员之后添加一个 ' = 0
' 或 ' '。{}
其中一条评论提到,显式默认的无参数 c-tor 将在表单的值初始化期间启用MyClass c{};
零初始化。查看http://en.cppreference.com/w/cpp/language/value_initialization我无法确定哪些语句指定了这一点。
初始化现在是一个复杂的话题,因为 C++11 已经改变了各种初始化结构的含义和语法。我无法从其他问题中收集到足够好的信息。但是,例如,请参阅编写默认构造函数强制零初始化?.
我面临的具体问题是:我想确保我的类的成员对于 (1) 声明默认 c-tor 的类和 (2) 没有声明默认 c-tor 的类都清零。
对于 (2),初始化 with{}
完成了这项工作,因为它是值初始化的语法,它转换为零初始化,或者如果您的类是聚合的,则聚合初始化 - 在没有提供初始化程序的成员的情况下(全部! ) 是零初始化的。
但是对于(1)我仍然不确定什么是最好的方法。从我收集的所有信息中我了解到,如果您提供默认的 c-tor(例如,用于将某些成员设置为某些值),您必须将剩余成员显式归零,否则语法MyClass c = MyClass();
或 C++11MyClass c{};
将无法完成这项工作. 换句话说,在这种情况下,值初始化意味着只调用你的 c-tor,就是这样(没有归零)。
如果您声明一个接受值的 c-tor 并将这些值设置为成员的子集,您会遇到同样的情况,但您希望其他成员为零:没有简写方式 - 我正在考虑 3 个选项:
我的推理正确吗?你会选择 3 个选项中的哪一个?
c++ - 原始数据类型在循环内分配了多少次?
这是一个例子:
j 是原始数据类型,k 是对象。根据Do built-in types have default constructors? ,
所以非类类型(包括基本类型、数组类型、引用类型、指针类型和枚举类型)没有构造函数。
根据在循环中声明变量,好的做法还是坏的做法?(2 部分) ,
对于对象(例如 std::string),必须在每次迭代时执行构造函数和析构函数。
我了解到,当调用函数时(例如main()
由操作系统调用),所有局部变量都在函数开始时创建并在函数结束时销毁。上面的while循环引用是说原始数据类型i
是在while循环块中声明时创建的,并在每次迭代的while循环块结束时销毁。
这是真的吗?#1是否为 while 循环的每次迭代分配了在 while 循环块中声明的原始数据类型?#2我是否错误地认为应该在包含 while 循环块的函数的开头创建 while 循环中的这些声明?
我正在寻找详细的解释,而不仅仅是是或否。
c++ - 直接初始化与值初始化
我是一名尝试学习 C++11 的 C 程序员,但我遇到了一些我不明白的事情。据我所知,以下问题是值初始化和直接初始化之间的区别。
以下代码片段无法使用 Visual Studio 进行编译:
它给了我:
错误 C2797:“TestClass::_msg”:未实现成员初始化器列表或非静态数据成员初始化器内的列表初始化
然而,改变
至
解决了我的问题。这两种初始化形式有什么区别,什么时候应该使用另一种?我被引导相信在处理显式类型时我应该使用值初始化。
c++ - POD 结构的值初始化是 constexpr?
考虑结构:
这是否总是有效的:
即 POD 的值初始化是constexpr
?同样,如果结构被定义为:
最后,这个呢:
我没有将 ctr 声明为 constexpr,但是是否有任何隐含的扣除规则可以保证这一点?
c++ - 如何强制编译器为未初始化的变量设置非零值?
我正在玩C++ 值初始化。
因此,我正在打印未初始化的值,以便根据 C++ 标准版本突出显示(取消)初始化。
但是未初始化的值通常传达零值:-(
如果变量尚未初始化,如何突出显示?
(即,如何告诉编译器为未初始化的变量使用特定值?)
也许这可以使用神奇的用户提供的分配器来完成......
编辑:我下面的片段不适用于生产。我只是想检查 C++ 标准的实现(由编译器)关于 uninitialization/value-initialization/zero-initialization/default-initialization 机制。我不想要关于未初始化变量的编译器警告。我不想使用 MemoryCheckers。我只想强调编译器零初始化一些变量,默认初始化一些其他变量并且不对所有其他变量进行初始化。而且这种初始化行为还取决于 C++ 标准的版本。如果您认为最好的方法是使用编译器警告或 MemoryCheckers,请使用以下代码段提供答案。
如果您已经理解了我的问题,请不要阅读下面的详细尝试。
使用-std=c++03
执行编译时可能会打印零值,但我更喜欢非零值。
可能的输出使用-std=c++11
另一个可能的输出使用-std=c++11
但是我更高级的代码片段现在对于未初始化的对象具有零值B{}.a.i
:-(
构建/运行输出:
d - 诠释我=诠释();D会发生什么?
考虑以下程序(在此处查看现场演示)
在像 C++ 这样的语言中,该语句int i=int();
被称为值初始化。对于 type int
,值初始化基本上最终是零初始化。如果我没记错的话,C++ 标准保证它总是给我零。但是 D 语言是否包含像 C++ 中那样的值初始化功能?在所有 D 编译器和我在 D 程序之上编译和运行的每个环境中,它是否一定会给我一个零?
c++ - 在 C++98/03 中,我们是否需要一个可访问的复制构造函数来进行值初始化?
这个问题仅指 pre C++11。考虑以下看似损坏的代码:
根据C++11 之前的cppreference.com,将调用默认 ctor:
值初始化的效果是:
1) 如果 T 是具有至少一个用户提供的任意类型构造函数的类类型,则调用默认构造函数;
...
这似乎意味着复制 ctor 不一定需要可访问。这是正确的还是不正确的?上面的代码无法编译,因此似乎必须可以访问复制 ctor。
c++ - 在未来的 C++ 中优雅地避免向量元素的值初始化?
当元素默认插入到 的实例中时std::vector<T>
,默认情况下它们会进行值初始化。我经常使用多线程高性能代码,在这种情况下,大型数组的这种值初始化可能代表不可接受的顺序瓶颈。
如果在并发代码中,基于reserve()
and push_back()
/的典型方法是没有用的。emplace_back()
我通常会选择以下选项之一:
- 定义一个空的默认构造函数
T
, construct()
具有空成员函数的自定义分配器的定义和使用。
然而,这两种解决方案都远非优雅,而且也有缺点。前者不能用作T
POD 类型,例如double
. 后者需要 C++ 标准库的给定实现来支持相对较新的DefaultInsertable
概念。此外,自定义分配器的定义非常繁琐。
有没有可能在 C++ 的未来有一些直接的方法来“关闭”这个默认插入/值初始化?
更新
Mayebe,我应该简单地问一下是否可以避免对算术类型的向量的默认插入元素进行零初始化。