首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >placement-new会引入序列点吗?

placement-new会引入序列点吗?
EN

Stack Overflow用户
提问于 2011-06-28 01:56:50
回答 5查看 201关注 0票数 12

考虑下面这行代码:

代码语言:javascript
复制
new (p++) T();

如果构造函数T()抛出异常,是否可以保证p已经被递增?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-28 02:16:14

从5.3.4 expr.new开始

11新的放置语法用于为分配函数提供额外的参数。如果使用,则对通过汇编参数列表创建的函数调用执行重载解析,该参数列表由请求的空间量(第一个参数)和new-expression的新放置部分中的表达式(第二个和后续参数)组成。

因此,在一个新的表达式中,分配函数在函数调用中使用(这是有意义的)。所有分配函数都是3.7.4.1 basic.stc.dynamic.allocation中的函数,包括实现提供的函数

1分配函数应为类成员函数或全局函数;...

因此,当从构造函数抛出异常时,分配已经发生,并且关联的函数调用表达式已经完全求值。

票数 8
EN

Stack Overflow用户

发布于 2011-06-28 02:15:06

是的,它保证是递增的。

运算符只是函数/方法调用的语法糖。

我不认为new在运算符上面有任何特殊的含义,所以它应该是相同的。

因此,在调用函数new之前,所有参数都已完全求值(使用序列点)。

票数 4
EN

Stack Overflow用户

发布于 2011-06-28 02:15:27

我不认为标准直接/明确地回答了这个问题。然而,答案隐含地是肯定的。

特别是,new的放置语法只是指定将传递给函数的额外参数的一种方式。与任何其他函数调用一样,在计算函数的所有参数(以未指定的顺序)和执行函数中的任何代码之间存在一个序列点。我相信这应该意味着你的p++将在任何其他事情发生之前进行评估并应用所有副作用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6496912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档