User
Замечение по коду -
constexpr tuple(T&&... args) { initialize_storage(std::make_index_sequence<sizeof...(T)>(), std::forward<T>(args)...); }
Здесь std:: forward не нужен, у вас здесь всегда rvalue ссылки. Можно обойтись std::move.
Чтобы конструировать tuple не из rvalue ссылок, то нужен шаблонный конструктор. Там и нужно использовать std::forward:
template<typename... U> constexpr tuple(U&&... args) { initialize_storage(std::make_index_sequence<sizeof...(T)>(), std::forward<U>(args)...); }
И тогда придётся переделать initialize_storage, чтобы она принимала эти forward-нутые типы
Замечение по коду -
Здесь std:: forward не нужен, у вас здесь всегда rvalue ссылки. Можно обойтись std::move.
Чтобы конструировать tuple не из rvalue ссылок, то нужен шаблонный конструктор. Там и нужно использовать std::forward:
И тогда придётся переделать initialize_storage, чтобы она принимала эти forward-нутые типы