考虑下面这行代码:
new (p++) T();如果构造函数T()抛出异常,是否可以保证p已经被递增?
发布于 2011-06-28 02:16:14
从5.3.4 expr.new开始
11新的放置语法用于为分配函数提供额外的参数。如果使用,则对通过汇编参数列表创建的函数调用执行重载解析,该参数列表由请求的空间量(第一个参数)和new-expression的新放置部分中的表达式(第二个和后续参数)组成。
因此,在一个新的表达式中,分配函数在函数调用中使用(这是有意义的)。所有分配函数都是3.7.4.1 basic.stc.dynamic.allocation中的函数,包括实现提供的函数
1分配函数应为类成员函数或全局函数;...
因此,当从构造函数抛出异常时,分配已经发生,并且关联的函数调用表达式已经完全求值。
发布于 2011-06-28 02:15:06
是的,它保证是递增的。
运算符只是函数/方法调用的语法糖。
我不认为new在运算符上面有任何特殊的含义,所以它应该是相同的。
因此,在调用函数new之前,所有参数都已完全求值(使用序列点)。
发布于 2011-06-28 02:15:27
我不认为标准直接/明确地回答了这个问题。然而,答案隐含地是肯定的。
特别是,new的放置语法只是指定将传递给函数的额外参数的一种方式。与任何其他函数调用一样,在计算函数的所有参数(以未指定的顺序)和执行函数中的任何代码之间存在一个序列点。我相信这应该意味着你的p++将在任何其他事情发生之前进行评估并应用所有副作用。
https://stackoverflow.com/questions/6496912
复制相似问题