[英]new-expression evaluation order in C++17
根據cppreference/eval_order規則 12,對分配 function( operator new
)的調用在(自 C++17 起)在 new 表達式中對構造函數 arguments 求值之前排序。 於是,我想到了以下
Bar b;
Foo* f = new Foo(b.fun());
在運行時導致首先調用new
然后調用b
上的fun()
,最后調用Foo
的構造函數。 Clang 和 ICC 都產生這個訂單。 然而 GCC 首先調用fun()
,然后是operator new
,然后是構造函數。
誰是對的? 我錯過了什么?
查看標准(版本N4835.pdf ):
7.6.2.7 新 [expr.new]
23 分配 function 的調用在 new-initializer 中的表達式評估之前排序。 分配的 object 的初始化在新表達式的值計算之前排序。
在您的情況下b.fun()
是 new-initializer 中的唯一表達式。
看起來 Clang、ICC 和 MSVC 做對了,而 GCC 做錯了。 值得詢問 GCC 的人,並可能提交一份錯誤報告(或者可能已經存在一個?)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.