根据operator?: result推导模板返回类型

And*_* DM 1 c++ templates c++11 c++14

考虑这段代码:

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

当调用此函数时,::max(5, 7.2)我期望返回的类型与本例中的类型int相同。decltype(t1)int

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

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

son*_*yao 5

请注意,条件运算符的结果类型是在编译时确定的。它不会根据条件返回不同的类型,但会返回操作数的公共类型作为结果。

6.2) 如果 E2 和 E3 都具有算术或枚举类型:应用通常的算术转换将它们转换为公共类型,并且该类型就是结果。

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

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

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