Ответ 1
Существует почти & dagger; нет функциональной разницы между этими двумя выражениями. tie()
меньше, тогда как make_tuple()
является более общим.
Согласно [tuple.creation], make_tuple
делает:
template<class... Types> constexpr tuple<VTypes...> make_tuple(Types&&... t);
Пусть
Ui
будетdecay_t<Ti>
для каждогоTi
в типах. Тогда каждыйVi
вVTypes
равенX&
, еслиUi
равноreference_wrapper<X>
, в противном случаеVi
естьUi
.
Следовательно, std::make_tuple( std::ref(x), std::ref(y), std::ref(z) )
дает & dagger; a std::tuple<X&, Y&, Z&>
.
С другой стороны, tie
делает:
template<class... Types> constexpr tuple<Types&...> tie(Types&... t) noexcept;
Возвращает:
tuple<Types&...>(t...)
. Когда аргумент вt
равенignore
, присвоение любого значения соответствующему элементу набора не влияет.
Следовательно, std::tie(x, y, z)
также дает a std::tuple<X&, Y&, Z&>
.
& dagger; За исключением одного краевого случая.