假设我们要编写一个工厂函数,该工厂函数接受任意参数列表并将未修改的参数传递给另一个函数。此类函数的一个示例是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)...)); }
省略号的使用...表示一个参数包,它表示任意数量的类型。编译器将在调用站点将此参数包扩展为正确数量的参数。然后,这些参数T使用传递给的构造函数std::forward。需要此函数来保留参数的ref限定符。
struct foo { foo() {} foo(const foo&) {} // 复制构造函数 foo(foo&&) {} // 复制构造函数 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);