当前位置: 首页 > 知识库问答 >
问题:

std::make_shared执行值初始化(GCC和clang不同意)吗?

闻梓
2023-03-14

下面的例子可以解释我的意思:

<代码>自动p=标准::使\u共享

int变量是默认初始化的(因此具有垃圾值)还是值初始化的(因此具有零值)?我在GCC 5.2和clang 3.6上进行了测试,前者进行值初始化,后者进行默认初始化。我想知道标准对此有什么规定?在我看来,在这种情况下,现代C肯定应该执行值初始化。

共有2个答案

呼延钱明
2023-03-14

标准似乎支持你的观点。

从20.8.2.26:

构造一个对象在内存中通过放置new-表达式::new(pv)T(std::forward(args)...(

由于new int()是值初始化的,与new int相比,我希望为零。

利永年
2023-03-14

N379720.8.2.2.6

为T类型的对象分配合适的内存,并通过placement new expression(代码)::new(pv)T(std::forward)在该内存中构造对象

所以,这里是

::new (pv) int();

N3797 8.5.1等

表单中发生的初始化

T x(a);
T x{a};

在新表达式(5.3.4)中也被称为直接初始化。

初始化程序的语义学如下。目标类型是正在初始化的对象或引用的类型,源类型是初始化程序表达式的类型。如果初始化程序不是单个(可能是括号)表达式,则不定义源类型。

-如果初始值设定项为(),则对象为值初始化对象。

T类型的对象进行值初始化意味着:

-否则,对象初始化为零。

New clang和GCC都同意标准:Live

 类似资料:
  • 以下节目 使用当前Clang(12.0.0)编译,但不使用当前GCC(11.0.0 20201028)。使用GCC它会产生错误 根据[dcl.init.list/5]和string_view(char const*)构造函数是constepr这一事实,我假设Clang的行为就在这里。 对吗?

  • 对于中继中的工作正常,但对于来自中继的,失败并显示错误消息(链接): 错误:未为此 lambda 函数捕获“此” 在命名空间范围内定义对两者都适用。 使用 lambda 捕获稍微修改的定义也适用于全局或本地范围。 哪个编译器是对的?

  • 当一个类具有 constexpr 成员函数并且该成员函数正在 constexpr 上下文中的 l 值对象上求值时,clang 和 gcc 不同意结果是否为 constexpr 值。为什么?是否有既不需要默认可构造性也不需要复制可构造性的解决方法? 当对象按值传递时,两个编译器都会成功编译。 Clang版本trunk,8,7: 和 gcc 版本主干,8.1、7.4:编译没有错误 https://go

  • 我试图使用clang和gcc交叉编译一个项目,但在使用时,我发现了一些奇怪的差异,例如。 现在,当涉及NAN时,我期望类型行为,但clang和gcc给出不同的结果: 当我使用它时,_mm_max_ps做了预期的事情。我尝试过使用,,但似乎没有效果。有什么想法可以让编译器之间的行为相似吗? 这里是锁销连接

  • 给定以下代码(在wandbox上): 和下列编译器选项: cppreference似乎建议语法应该触发显式转换。

  • 问题内容: 我正在使用celery在Hadoop上运行长时间运行的任务。每个任务都会在Hadoop上执行Pig脚本,该脚本运行大约30分钟-2小时。 我当前的Hadoop设置有4个队列a,b,c和默认队列。当前,所有任务都由一个工人执行,该工人将作业提交到单个队列中。 我想再添加3个将作业提交到其他队列的工作程序,每个队列一个工作程序。 问题是队列当前是硬编码的,我希望为每个工作人员设置此变量。