表达三元条件`?:`的结果类型

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 将其参数转换为值类型。在任何情况下,重点是显式表达类型,而不是通过 autotypeof

知道如何制作一个 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