工廠功能

假設我們要編寫一個接受任意引數列表的工廠函式,並將那些未修改的引數傳遞給另一個函式。這種函式的一個例子是 make_unique,它用於安全地構造 T 的新例項並返回擁有該例項的 unique_ptr<T>

關於可變引數模板和右值引用的語言規則允許我們編寫這樣的函式。

template<class T, class... A>
unique_ptr<T> make_unique(A&&... args)
{
    return unique_ptr<T>(new T(std::forward<A>(args)...));
}

橢圓 ... 的使用表示引數包,其表示任意數量的型別。編譯器會將此引數包擴充套件為呼叫站點上正確數量的引數。然後使用 std::forward 將這些引數傳遞給 T 的建構函式。需要此函式來保留引數的 ref 限定符。

struct foo
{
    foo() {}
    foo(const foo&) {}                    // copy constructor
    foo(foo&&) {}                         // copy constructor
    foo(int, int, int) {}
};

foo f;
auto p1 = make_unique<foo>(f);            // calls foo::foo(const foo&)
auto p2 = make_unique<foo>(std::move(f)); // calls foo::foo(foo&&)
auto p3 = make_unique<foo>(1, 2, 3);