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

3
正如标题所述,为什么没有从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,我需要改变/添加哪些内容?

这里是一个展示问题的godbolt链接:https://godbolt.org/z/zqfrETKEz

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


可能是因为这是一个非常特殊的情况,原本介绍元组的标准提案的工作人员没有考虑到,而且由于没有提出任何添加此行为的提案,或者自那时以来没有被认为足够重要,所以才会出现这种情况。 - Salvage
1个回答

6

由于zip论文(P2321)的结果,在中将会有此功能。


一般来说,过载集通常有一个接受 T const& 和另一个接受 T&& 的重载,很少需要 T& 作为一个独立的第三个选项(T const&& 更少)。这是最初只有两个选项的情况之一,但确实需要至少第三个选项。
我不确定您需要 tuple<int>& 转换为 tuple<int&> 的特定动机是什么,但 zip 需要它才能工作,这就是为什么发生了更改的原因。

感谢你的有益回答,Barry。是的,我正在实现一个 tuple_vector 容器,其中 value_type == tuple<Ts...>reference == tuple<Ts&...>,而通常 reference == value_type&。为了能够将 tuple_vectorranges 库和 views 一起使用,需要满足 std::input_iterator<tuple_vector<Ts...>::iterator>,然后满足 std::indirectly_readable,因此 tuple<Ts...>& 需要转换为 tuple<Ts&...>(请参见 std::common_reference_with)。 - serkan.tuerker
巴里,有没有可用的 tuple 更改实现? - serkan.tuerker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接