为什么没有从 std::tuple<Ts...>& 到 std::tuple<Ts&...> 的(隐式)转换?

Why is there no (implicit) conversion from std::tuple<Ts...>& to std::tuple<Ts&...>?

  1. 如标题所述,没有从 std::tuple<Ts...>&std::tuple<Ts&...> 的(隐式)转换是否有特定原因? 相比之下,EASTL 的 tuple 实现提供了这种转换。
#include <EASTL/tuple.h>

#include <tuple>

#include <type_traits>

int main()
{
  using TupleRef = std::tuple<int, float>&;
  using RefTuple = std::tuple<int&, float&>;

  using EATupleRef = eastl::tuple<int, float>&;
  using EARefTuple = eastl::tuple<int&, float&>;

  // static_assert(std::is_convertible_v<TupleRef, RefTuple>); // fails to compile
  static_assert(std::is_convertible_v<EATupleRef, EARefTuple>);

  return 0;
}
  1. 如果我重新实现 STL tuple 实现,我必须 change/add 做什么?

这里有一个link来解决show-casing问题:https://godbolt.org/z/zqfrETKEz

PS:我在 godbolt 中使用了 c++17 标志,因为 EASTL 不使用 c++20 标志编译,但我也对 c++20 解决方案感兴趣。

会有在, as a result of the zip paper (P2321).


一般来说,重载集通常有一个重载采用 T const& 和另一个重载采用 T&&,通常需要 T& 作为不同的第三个选项(T const&& 更是如此)。这是最初只有两个的案例之一,但实际上确实至少需要第三个。

我不确定您是否有特定的动机需要 tuple<int>& 转换为 tuple<int&>,但 zip 需要它才能工作,这就是它发生变化的原因。