表达三元条件`?:`的结果类型
Expressing the result type of the ternary conditional `?:`
您为以下函数指定的 return 类型是什么,它应该像 ?:
但没有惰性?
我的第一次尝试如下:
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())++;
编译良好,return是一个悬空引用。
我的第二次尝试是将 return 类型更改为:
typename std::remove_reference<T1>::type
然后
(true ? x : x)++
有效,但是:
myif(true, x, x)++
不像我现在return按值计算。
甚至:
auto myif(bool b, T1&& true_result, T2&& false_result)
-> typeof(b ? true_result : false_result)
失败,我不确定为什么,也许 typeof
将其参数转换为值类型。在任何情况下,重点是显式表达类型,而不是通过 auto
和 typeof
。
知道如何制作一个 return 与 ?:
类型相同的函数吗?
我认为最好的方法是 提出的:
template <typename T1, typename T2>
auto myif(bool b, T1&& true_result, 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, T1&& true_result, T2&& false_result)
{
// same body
}
鉴于:
int f() { return 42; }
int x = 5, y = 7;
myif(true, x, f())++; // error: lvalue required as increment operand
myif(false, x, y)++; // OK
您为以下函数指定的 return 类型是什么,它应该像 ?:
但没有惰性?
我的第一次尝试如下:
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())++;
编译良好,return是一个悬空引用。
我的第二次尝试是将 return 类型更改为:
typename std::remove_reference<T1>::type
然后
(true ? x : x)++
有效,但是:
myif(true, x, x)++
不像我现在return按值计算。
甚至:
auto myif(bool b, T1&& true_result, T2&& false_result)
-> typeof(b ? true_result : false_result)
失败,我不确定为什么,也许 typeof
将其参数转换为值类型。在任何情况下,重点是显式表达类型,而不是通过 auto
和 typeof
。
知道如何制作一个 return 与 ?:
类型相同的函数吗?
我认为最好的方法是
template <typename T1, typename T2>
auto myif(bool b, T1&& true_result, 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, T1&& true_result, T2&& false_result)
{
// same body
}
鉴于:
int f() { return 42; }
int x = 5, y = 7;
myif(true, x, f())++; // error: lvalue required as increment operand
myif(false, x, y)++; // OK