サーチ…
備考
完璧な転送では、引数のref-qualifierを保持するために参照を転送する必要があります。そのような参照は、 推測された文脈においてのみ現れる。あれは:
template<class T>
void f(T&& x) // x is a forwarding reference, because T is deduced from a call to f()
{
g(std::forward<T>(x)); // g() will receive an lvalue or an rvalue, depending on x
}
T
はコンストラクタ呼び出しから推測されないので、以下は完全な転送を含まない:
template<class T>
struct a
{
a(T&& x); // x is a rvalue reference, not a forwarding reference
};
C ++ 17
C ++ 17では、クラステンプレートの引数を控除できます。上記の例の "a"のコンストラクタは、転送参照のユーザになります
a example1(1);
// same as a<int> example1(1);
int x = 1;
a example2(x);
// same as a<int&> example2(x);
ファクトリ関数
任意の引数リストを受け取り、変更されていない引数を別の関数に渡すファクトリ関数を記述したいとします。そのような関数の例はmake_unique
であり、これはT
新しいインスタンスを安全に構築し、そのインスタンスを所有するunique_ptr<T>
を返すために使用されます。
バリデーショナルなテンプレートやr値の参照に関する言語規則は、このような関数を書くことを可能にします。
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-qualifierを保持するために必要です。
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);
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow