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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |