是否有任何工具可以删除标准库中的右值引用而不是右值引用?

Is there any tool to remove rvalue reference but not lvalue refrence within the standard library?

提问人:AKL 提问时间:7/14/2023 更新时间:7/14/2023 访问量:79

问:

基本上我想要这个:

template<typename TYPE>
struct not_rvalue_reference{
    typedef std::conditional_t<std::is_rvalue_reference_v<TYPE>, std::remove_reference_t<TYPE>, TYPE> type;
};

template<typename TYPE>
using not_rvalue_reference_t = typename not_rvalue_reference<TYPE>::type;

因此,无论哪种类型,我都会得到非引用类型或左值引用类型。

我想知道标准库中是否存在这样的东西,如果没有,我必须使用它,它的最佳名称是什么?

C++ 模板 参考 标准库

评论

0赞 NathanOliver 7/14/2023
你想用它来做什么?这听起来几乎像是您正在寻找返回类型。decltype(auto)
0赞 AKL 7/14/2023
@NathanOliver-IsonStrike,我需要这个工具来为基于元组的类提供推导。我想要要么拥有或(也是这些的混合),但不是'''tuple<type&&,type&&,...>.我不希望它用于返回类型。tuple<type, type,...>tuple<type&,type&,...>
1赞 康桓瑋 7/14/2023
是更好的名字吗?remove_rvalue_reference
0赞 AKL 7/14/2023
@康桓瑋是的,这确实是一个更好的名字。谢谢

答:

1赞 Eric M Schmidt 7/14/2023 #1

查阅 cppreference 文档以获取<type_traits>,标准库中似乎没有这样的工具。我同意评论者康桓瑋的观点,这是一个好名字。为了减少模板实例化开销,我建议采用更直接的实现方式:remove_rvalue_reference

template<typename T>
struct remove_rvalue_reference
{
    using type = T;
};

template<typename T>
struct remove_rvalue_reference<T&&>
{
    using type = T;
};

template<typename T>
using remove_rvalue_reference_t = remove_rvalue_reference<T>::type;

评论

0赞 AKL 7/15/2023
谢谢你的回答。最后一行中应该有一个,在 之后。我编辑了答案,请看一下。typename=
0赞 BoP 7/15/2023
@AKL - 如果您使用最新的 C++ 标准,则不再需要此处。请参阅使用 typename 打倒!typename