首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++14中保留左值引用的同时衰减右值引用类型?

如何在C++14中保留左值引用的同时衰减右值引用类型?
EN

Stack Overflow用户
提问于 2021-02-09 14:50:41
回答 3查看 49关注 0票数 2

我有以下C++14 lambda

https://godbolt.org/z/aexxTY

代码语言:javascript
复制
#include <boost/optional.hpp>


int main(){
    auto foo = [](auto && t) 
    {
        using T = decltype(t);
        return boost::optional<T>(std::forward<T>(t));
    };

    // This is fine because i is lvalue
    auto i = 10;
    foo(i);

    // This fails because i is rvalue
    foo(10);
}

首先请注意,boost::optional可以包含左值引用,但不能包含右值引用。

是否可以使用上面的泛型lambda将rvalue作为副本处理。我想要的是像这样聪明的东西

代码语言:javascript
复制
using T = std::decay_if_rvalue<decltype(t)>::type

有没有什么开箱即用的东西可以做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-09 14:55:31

您可以将std::is_rvalue_referencestd::conditional一起使用,两者都来自<type_traits>标头。

代码语言:javascript
复制
auto foo = [](auto && t) 
{
    using Orig = decltype(t);
    using T = std::conditional_t<std::is_rvalue_reference<Orig>::value,
            std::decay_t<Orig>, Orig>;
    return boost::optional<T>(std::forward<T>(t));
};

https://godbolt.org/z/WdTdco

票数 2
EN

Stack Overflow用户

发布于 2021-02-09 14:55:29

您可以将类型特征编写为

代码语言:javascript
复制
template< class T > struct remove_rvalue_reference       {typedef T type;};
template< class T > struct remove_rvalue_reference <T&&> {typedef T type;};

然后

代码语言:javascript
复制
using T = typename remove_rvalue_reference<decltype(t)>::type;

然后

代码语言:javascript
复制
auto i = 10;
foo(i);   // T will be int& in the lambda

foo(10);  // T will be int  in the lambda
票数 2
EN

Stack Overflow用户

发布于 2021-02-09 15:10:37

lubgr's answer上展开,您可以将条件类型封装在与C++14兼容的别名中,如下所示:

代码语言:javascript
复制
#include <type_traits>

template <class T>
using decay_rvalue_reference_t = std::conditional_t<
    std::is_rvalue_reference<T>::value,
    std::decay_t<T>::type,
    T>;

auto foo = [](auto && t) 
{
    using T = decay_rvalue_reference_t<decltype(t)>;
    return boost::optional<T>(std::forward<T>(t));
};

https://godbolt.org/z/YW88Yf

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66114232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档