我的意思可以通过以下示例来解释:
UNION ALL
auto p = std::make_shared<int>();
变量是否默认初始化(因此具有垃圾值)或初始化值(因此值为零)?我已经在GCC 5.2和clang 3.6上进行了测试,前者进行了值初始化,后者进行了默认初始化。我想知道标准对此有何看法?在我看来,在这种情况下,现代C ++肯定应该执行值初始化。
答案 0 :(得分:23)
是强>
N3797 20.8.2.2.6
分配适合T类对象的内存并构造一个 通过放置新表达式
在该内存中的对象::new (pv) T(std::forward<Args>(args)...)
所以,这将是
::new (pv) int();
依旧于N3797 8.5.1
表单中出现的初始化
T x(a); T x{a};
以及新表达式(5.3.4)称为直接初始化。
初始化器的语义如下。目的地类型是 正在初始化的对象或引用的类型以及源 type是初始化表达式的类型。如果初始化程序是 不是单个(可能带括号的)表达式,源类型是 没有定义。
- 如果初始值设定项为
()
,则对象将进行值初始化。对
T
类型的对象进行值初始化意味着:- 否则,该对象为零初始化。
新铿锵和GCC都同意这个标准:Live
答案 1 :(得分:6)
该标准似乎支持您的意见。
从20.8.2.2.6开始:
通过放置new-expression :: new(pv)T(std :: forward(args)...)构建该内存中的对象
由于new int()是初始化的值,与new int相比,我希望为零。