2016-09-01 5 views
1

(::new (std::declval< void * >()) T())->~T()は意味がありません(noexceptの意味ではありますが、式の型には意味がありません)単純なT()に相当します。多くの場合、グローバルでもクラススコープでもoperator newに過負荷がかかっていないとします。プレースメントnewプラスデストラクタと単純な値の初期化noexcept semantic

多くの場合、型形質でT()オペレータnoexcept()の内側で使用され、別のコンストラクタのみがnoexceptであるかどうかを判断します。確かにそれは間違っています。

ここでは、T()は、デフォルトのコンストラクタまたは他のコンストラクタの呼び出しのいずれかであると見なすことができます。

答えて

0

1は(::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()); 
} 

コンパイラはsizeofvoid

+0

フェアを取得しようと訴えるべきです。私の間違い。私は 'noexcept'センスだけを考えたいと思う。質問を編集できるようにしてください。 – Orient

関連する問題