2016-06-15 5 views
6

私は条件付きnoexceptの使い方を学び、この問題に遭遇します。私はクラスがあるとします。noexceptの式と型の特性

template<typename T> 
class Wrapper { 
public: 
    Wrapper(T&& value) noexcept(/* ??? */) 
     : value_(std::move(value)) 
    {} 

private: 
    T value_; 
}; 

/* ??? */の部分については、私は私がthisにつまずいまで我々は、noexcept(T(std::move(value)))またはstd::is_nothrow_move_constructible<T>::valueのいずれかを使用することができると思いました。私はnoexcept(noexcept(T(std::move(value))))を使用する場合

だから、厳密に言えば、私は「このコンストラクタはを構築し、Tあるnoexcept破壊場合に限っnoexceptである」とすることを言っていますか?

スローするデストラクタは、火をつけて焼くべきですが。

+3

'noexcept(新しいT(std :: move(value)))'またはsometing?それは実際には何も割り当てられていないので、それは具体的に "漏れ"とdtorは関与すべきではありません...私はあなたが新しいのノースローバージョンを使用する必要がありますね、 'std :: bad_alloc'を検出したい。 –

答えて

6

良い質問、this language defect discussionも参照してください。その名前からstd::is_nothrow_move_constructible<T>::valueになるのは、実際の値からの構成体に関連するだけですが(実際には破壊にも関係します)、noexcept(T(std::move(value)))は常に建設と破壊の両方に関係しています。

だから、あなたのケースでは、ほとんどがstd::is_nothrow_move_constructible形質の未解決の問題を避け、道を保存し、 '(クリス・ベックさんのコメントで述べた)std::bad_allocの問題を避け、新しい配置を使用し、そして、同様に、Tを使用することですラッパーのデストラクタ用のデストラクタです。

template<typename T> 
class Wrapper { 
public: 
    Wrapper(T&& value) noexcept(new(nullptr) T(std::move(value))) 
     : value_(std::move(value)) 
    {} 
    ~Wrapper() noexcept(noexcept(value_.T::~T())) 
    {} 
private: 
    T value_; 
}; 
+1

_ "std :: is_nothrow_move_constructible :: value'はコンストラクタ" _ - にしか関係していないことは明らかです。それは明らかではないですが、問題は解決されていません。提出者の期待が正しいか、標準に何らかの欠陥があることを示します。 –

+0

@JonathanWickely point taken。私は質問を編集しました。私は、C++の標準構造ではスズについて言うべきことを行うべきだと考えています。つまり、このケースでは、型にノースローの移動コンストラクタがあるかどうかだけをテストします。 – Walter

+0

しかし、この特性は "nothrow move constructor"ではありません([N3142](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3142.html)を参照してください。それはない)。代わりに、rvalueからオブジェクトを作成することができるかどうかを示します。これは同じではありません。また、デストラクタが投げることができれば、非投げの動きを持つ要素のためのコンテナの内部のようなものを最適化するのは良いことではないため、スローを作成するかどうかを知りたい場合は、破棄するかどうかを知りたい場合もあります。 –

関連する問題