Supposons que j'ai une classe de modèlecomportement de référence avec Forwarding types définis
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)...} { }
};
Je comprends que dans ce cas Args&&...
sont des références rvalue, et je aurais pu tout aussi bien écrit std::move
au lieu de std::forward
.
Je peux aussi avoir un constructeur avec des références lvalue, comme si
foo(const Args&... args): t{args...} { }
La question est de savoir s'il est possible d'obtenir le même comportement que les références de transfert, mais pour des types précis? La raison pour laquelle je veux que c'est que je puisse utiliser la syntaxe comme
foo bar({. . .}, {. . .}, . . ., {. . .});
Cela fonctionne si je définis le constructeur foo(Args&&... args)
, mais ne permet pas d'un scénario mixte, où je veux initialiser certains des éléments de tuple membres avec listes d'initialisation accolées entre accolades et d'autres copiés à partir d'instances d'objet préexistantes.
Ce n'est pas une "référence de renvoi" s'il ne s'agit pas d'une référence de renvoi. (Les références de transfert requièrent la déduction de l'argument template.) –