2016-09-01 19 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