テンプレートクラスがあるとします
template <typename T> class foo;
template <typename... Args>
struct foo<std::tuple<Args...>> {
std::tuple<Args...> t;
foo(Args&&... args): t{std::forward<Args>(args)...} { }
};
Args&&...この場合は右辺値参照であることを理解していstd::moveますstd::forward。
次のように、左辺値参照を持つコンストラクターを使用することもできます
foo(const Args&... args): t{args...} { }
問題は、転送参照と同じ動作を得ることができるかどうかですが、明確な型の場合ですか? これが欲しい理由は、次のような構文を使用できるようにするためです
foo bar({. . .}, {. . .}, . . ., {. . .});
これは、foo(Args&&... args)コンストラクターを定義すると機能しますが、メンバーのタプル要素の一部を中括弧で囲まれた初期化子リストで初期化し、他の要素を既存のオブジェクト インスタンスからコピーするという混合シナリオは許可されません。