13

この特別なコンストラクターが初期化子リストを取得する目的は何ですか。誰かがこれがいつ役立つかの例を挙げてもらえますか?

template <class U, class... Args>
constexpr explicit optional(in_place_t, initializer_list<U> il, Args&&... args);

上記はこれとどう違うのですか?

template <class... Args> 
constexpr explicit optional(in_place_t, Args&&... args); 

参照: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3793.html#optional.object.ctor

PS c++14 または c++1z タグを使用するかどうかはわかりません。C++ 技術仕様のタグが必要だと思います

4

1 に答える 1

11

2 つの別個のコンストラクターの理由は、コンストラクター引数として を受け取るオブジェクトの構築を許可するためinitializer_listです (オプションで、引数の任意のリストが続きます)。foo次のようなタイプがあるとします。

struct foo
{
    foo(std::initializer_list<int>) {}
};

コンストラクターがない場合

template <class U, class... Args>
constexpr explicit optional(in_place_t, initializer_list<U> il, Args&&... args);

optionalasを構築することはできません

optional<foo> o(in_place, {1, 2, 3});

ブレース初期化リストに型がないため、上記は失敗し、テンプレート引数の推定は失敗します。次のような方法に頼る必要があります。

auto il = {1, 2, 3};
optional<foo> o(in_place, il);

引数を受け入れるコンストラクターを使用すると、オブジェクトinitializer_listを構築するときに、より自然な構文が可能になりoptionalます。

以下は、2 つのコンストラクターの有用性を示す最小限の例です。

于 2014-12-03T04:18:42.013 に答える