簡體   English   中英

C++17 中的新表達式求值順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM