加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 表示三元条件`?:`的结果类型

发布时间:2020-12-16 07:10:49 所属栏目:百科 来源:网络整理
导读:你为以下函数指定了什么样的返回类型?应该是什么样的?:但没有懒惰? 我的第一次尝试如下: template typename T1,typename T2T1 myif(bool b,T1 true_result,T2 false_result){ if (b) { return true_result; } else { return false_result; }} 但后来我
你为以下函数指定了什么样的返回类型?应该是什么样的?:但没有懒惰?

我的第一次尝试如下:

template <typename T1,typename T2>
T1 myif(bool b,T1&& true_result,T2&& false_result)
{
    if (b) {
        return true_result;
    } else {
        return false_result;
    }
}

但后来我找到了:

int f() { return 42; }
int x = 5;

同时

(true ? x : f())++;

落入编译,

myif(true,x,f())++;

编译好并返回一个悬空参考.

我的第二次尝试是将返回类型更改为:

typename std::remove_reference<T1>::type

但是之后

(true ? x : x)++

有效,但是:

myif(true,x)++

不是因为我现在正按价值返回.

甚至:

auto myif(bool b,T2&& false_result) 
  -> typeof(b ? true_result : false_result)

失败,我不知道为什么,也许typeof将它的参数转换为值类型.无论如何,重点是明确表达类型,而不是通过auto和typeof.

知道如何创建一个返回相同类型的函数?:?

解决方法

我认为最好的方法是 Casey提出的建议:

template <typename T1,typename T2> 
auto myif(bool b,T2&& false_result)
    -> decltype(b ? std::forward<T1>(true_result) : std::forward<T2>(false_result))
{
    if (b) {
        return true_result;
    } else {
        return false_result;
    }   
}

在C 14中,它变成了:

template <typename T1,typename T2> 
decltype(auto) myif(bool b,T2&& false_result)
{
    // same body
}

鉴于:

int f() { return 42; }
int x = 5,y = 7;

myif(true,f())++; // error: lvalue required as increment operand
myif(false,y)++;  // OK

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读