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

kan*_*tar 3 c++ tuples eastl c++17 c++20

  1. 正如标题所述,是否有特定原因导致没有从std::tuple<Ts...>&到 的(隐式)转换std::tuple<Ts&...>?相反,tupleEASTL 的实现提供了这种转换。
#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;
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果我重新实现了 STL 实现,我需要更改/添加什么tuple

以下是 godbolt 展示问题的链接:https ://godbolt.org/z/zqfrETKEz

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

Bar*_*rry 6

作为论文(P2321 )的结果,中将会有。zip


一般来说,过载设置通常具有一个过载承受T const&和另一个过载承受T&&,通常T&不需要作为独特的第三个选项(甚至T const&&更少)。这是最初只有两个的案例之一,但实际上确实至少需要第三个。

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