2016-07-23 8 views
14

hereを示すように、std::unique_ptrはNULLポインタのための2つconstexprコンストラクタを持っていますのstd :: unique_ptrをconstexprのコンストラクタ

constexpr unique_ptr(); 
constexpr unique_ptr(nullptr_t); 

私はこれらの2つのコンストラクタのための2つの質問があります。

  1. なぜ我々は2が必要なのかを?

    constexpr unique_ptr(nullptr_t = nullptr); 
    
  2. は本当に便利constexprです:私たちは同じように1を宣言することができませんか? (1)、それは確実にあると考えることの両方の引数なしのコンストラクタunique_ptr()とするため

    constexpr std::unique_ptr<int> p; 
    // error: the type 'const std::unique_ptr<int>' of constexpr variable 'p' 
    // is not literal because 'std::unique_ptr<int>' has a non-trivial destructor 
    
+3

これは同じ質問にリンクします – Dutow

+0

@Dutow Hahahaha –

+0

LOLのコピー/ペーストは失敗します。しかし、oldrinbの答えは、私がリンクしようとしていたものへのリンクです。 –

答えて

14

:(G ++ 6.1.0、-std=c++14を)私は私のコードでこれをやってみましたが、それはコンパイルされませんでしたnullポインタのコンストラクタunique_ptr(nullptr_t)は同じコンパイル時の保証を持っています。すなわち、両方ともconstexprです。私たちは、§20.8.1.2の違いを見ることができます:2デフォルト値を持つ単一のコンストラクタに結合していなかったのはなぜ

constexpr unique_ptr() noexcept; 
explicit unique_ptr(pointer p) noexcept; 
... 
constexpr unique_ptr(nullptr_t) noexcept 
: unique_ptr() { } 

は、おそらく歴史の不測の事態です。静的の形態として、

constexprコンストラクタ一定の初期化に使用することができ、これは:(2)、なぜ我々は、非自明なデストラクタを持つにもかかわらず、およそconstexprを気にthe answer given hereが考慮すべきに関して

動的初期化が行われる前に必ず初期化されます。

例えば、グローバルstd::mutexを与え:

std::mutex mutex; 

準拠の実装では(読み:いないMSVC)std::mutexのコンストラクタがconstexprあるbecuase、他のオブジェクトのコンストラクタが安全、mutexをロック及びアンロックすることができるが。 Q1としては

9

nullptr_tコンストラクタがよく、元の提案(N1586)後、N2435に後添加しました。

1つの行で指定できる単純なオーバーロードを追加することは、賢明にしようとするよりはるかにクリーンです。特に、[メンバ関数]は実装で既に「賢い」バージョンを使用できるようにしています。

+1

標準で指定されている現在の2つのctorsは、私の質問のものと機能的に同等でなければなりません。 –

関連する問題