5

引数を転送するときに () または {} を使用する必要がありますか? を参照してください。. クローンですfoostd::vector

N4140 では、unique.ptr.create std::make_uniqueは次のように指定されます。

template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);

  • 備考: この関数はT、 が配列でない限り、オーバーロードの解決に参加しません。

  • 戻り値: unique_ptr<T>(new T(std::forward<Args>(args)...)).

つまり、実装はオブジェクトを初期化するの()ではなく、使用する必要があります。{}例として、以下

auto s1 = std::make_unique<foo>(3, 1).get()->size();
auto s2 = std::make_unique<foo>(1).get()->size();
auto s3 = std::make_unique<foo>(2).get()->size();
std::cout << s1 << s2 << s3;

が出力されます312が、{}(inside std::make_unique) が使用された場合211は出力されます。初期化子リストは推測できないstd::initializer_listため、後者の結果を取得するには、明示的に渡す必要があります。問題は、なぜこのようなオーバーロードが提供されないのかということです。

namespace test
{

template <class T, class Deduce>
std::unique_ptr<T> make_unique(std::initializer_list<Deduce> li)
{
    return ::std::make_unique<T>(li);
}

};

int main()
{
    auto p1 = test::make_unique<foo>({3, 1}).get()->size();
    auto p2 = test::make_unique<foo>({1}).get()->size();
    auto p3 = test::make_unique<foo>({2}).get()->size();
    std::cout << p1 << p2 << p3;
}

出力し211ます。

「自分で書ける」とか「標準を肥大化させないため」という理由はあまり正当な理由とは思えません。この過負荷を提供することの欠点はありますか?

4

2 に答える 2