Dans la STL de MSVC, l'implémentation de std::apply
est la suivante :
template
constexpr decltype(auto) _Apply_impl(_Callable&& _Obj, _Tuple&& _Tpl, index_sequence<_Indices...>) noexcept(/* [...] */) {
return _STD invoke(_STD forward<_Callable>(_Obj), _STD get<_Indices>(_STD forward<_Tuple>(_Tpl))...);
}
Dans l'expression _STD get<_Indices>(_STD forward<_Tuple>(_Tpl))...
, std::get
est appelé le même nombre de fois que la taille du tuple. Cependant, à chaque invocation de std::get
, il y a une invocation correspondante de std::forward.
Lors de la transmission d'une rvalue, std::forward
est équivalent à std::move
, ce qui implique plusieurs appels à std::move
pour l'objet _Tpl
. Cela semble potentiellement invalide. Quelqu'un pourrait-il m'aider à expliquer ma préoccupation ?
J'ai essayé de rechercher à travers diverses ressources, mais je n'ai pas trouvé la réponse que je cherchais. Même à partir de la définition, je n'ai pas été convaincu.