「構造化束縛でパックを導入できるようにする」のページの「std::apply()の実装改善」のサンプルコードで、以下の2点が気になります。
std::forward_like() に第2テンプレート引数を渡しており、コンパイルエラーになる
- 1.を直したとしても、参照を持つタプルを渡すが考慮されておらず、
std::tuple<std::string&>&& などを渡した時に要素の参照先がムーブされてしまう( std::apply() と異なる動作)
template <class F, class Tuple>
constexpr decltype(auto) apply(F &&f, Tuple &&t)
{
auto&& [...elems] = t;
return std::invoke(std::forward<F>(f),
std::forward_like<Tuple, decltype(elems)>(elems)...);
}