为什么没有从 std::tuple<Ts...>& 到 std::tuple<Ts&...> 的(隐式)转换?
Why is there no (implicit) conversion from std::tuple<Ts...>& to std::tuple<Ts&...>?
- 如标题所述,没有从
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;
}
- 如果我重新实现 STL
tuple
实现,我必须 change/add 做什么?
这里有一个link来解决show-casing问题:https://godbolt.org/z/zqfrETKEz
PS:我在 godbolt 中使用了 c++17
标志,因为 EASTL 不使用 c++20
标志编译,但我也对 c++20
解决方案感兴趣。
- 如标题所述,没有从
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;
}
- 如果我重新实现 STL
tuple
实现,我必须 change/add 做什么?
这里有一个link来解决show-casing问题:https://godbolt.org/z/zqfrETKEz
PS:我在 godbolt 中使用了 c++17
标志,因为 EASTL 不使用 c++20
标志编译,但我也对 c++20
解决方案感兴趣。