2016-09-01 15 views
1

可以假設在未評估的上下文中,(::new (std::declval< void * >()) T())->~T()在語義上(在noexcept的意義上,但不是在表達類型意義上)等價於簡單T()?假設全球性的,也不是類範圍operator new超載,如果它喃喃自語。放置新的加析構函數和簡單的值初始化noexcept語義

通常在類型特徵T()內部運算符noexcept()中用於確定是否只有單獨的構造函數是否爲noexcept。這當然是錯誤的。

爲了防止失去一般性,可以假設T()這裏是要麼調用默認的構造函數,要麼調用任何其他的構造函數。

回答

0

可以在一個在未計算方面假定,(::new (std::declval< void * >()) T())->~T()語義完全等同於簡單的 T()

不可以,最後一個表達式存在析構函數,它隱含地爲void返回類型。

#include <new> 
#include <type_traits> 

struct T{int x; double y; }; 
int main(){ 
    constexpr int size = sizeof((::new (std::declval< void * >()) T())->~T()); 
} 

編譯器應該抱怨試圖讓sizeof一個void

+0

博覽會。我的錯。我只想考慮'noexcept'的含義。請允許我編輯該問題。 – Orient