根据运算符推导模板返回类型?:结果

时间:2019-01-30 01:58:04

标签: c++ c++11 templates c++14

考虑以下代码:

template <typename T1, typename T2>
auto max(T1 t1, T2 t2) -> decltype(true?t1:t2)
{
  return t2 < t1 ? t1 : t2;
}

使用::max(5, 7.2)调用此函数时,我期望返回的类型为int,因为在这种情况下,decltype(t1)int

在decltype中使用double时,为什么上面的代码中推导的返回类型为operator?:

如果我做-> decltype(t1),我会得到预期的回报类型int

1 个答案:

答案 0 :(得分:4)

请注意,conditional operator的结果类型是在编译时确定的。它不会根据条件返回不同的类型,但会返回操作数的普通类型作为结果。

  

6.2)如果E2和E3都具有算术或枚举类型:则应用usual arithmetic conversions使其成为普通类型,而该类型就是结果。

在这种情况下,即一个操作数是int,另一个是double,结果类型将是double

  
      
  • 否则,如果其中一个操作数为double,则另一个操作数将转换为double
  •   

顺便说一句:您可以使用std::common_type(从C ++ 11开始)来获取通用类型。