考虑以下代码:
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
。
答案 0 :(得分:4)
请注意,conditional operator的结果类型是在编译时确定的。它不会根据条件返回不同的类型,但会返回操作数的普通类型作为结果。
6.2)如果E2和E3都具有算术或枚举类型:则应用usual arithmetic conversions使其成为普通类型,而该类型就是结果。
在这种情况下,即一个操作数是int
,另一个是double
,结果类型将是double
。
- 否则,如果其中一个操作数为double,则另一个操作数将转换为double
顺便说一句:您可以使用std::common_type
(从C ++ 11开始)来获取通用类型。