以下两个涉及自动返回类型的声明是否相同?如果是这样,为什么?

meg*_*ium 5 c++ c++11 c++14

我很困惑为什么我正在阅读的书说以下两个声明具有相同的效果:

template<typename T1, typename T2> auto max (T1 a, T2 b) -> decltype(b<a?a:b);

template<typename T1, typename T2> auto max (T1 a, T2 b) -> decltype(true?a:b);
Run Code Online (Sandbox Code Playgroud)

在第一个声明中,返回类型max(a, b)可以是类型a或类型b.在第二个声明中,返回类型是类型a.两个声明如何具有相同的效果?

以下是我读到的文章:

在此输入图像描述

在此输入图像描述

Typ*_*eIA 7

在第二个声明中,返回类型是类型a.

你基于这个假设是什么?我认为这是混乱的根源.三元表达式(或任何表达式)的评估静态类型不依赖于操作数值的任何语义分析,仅取决于操作数的类型.所有三个三元操作数的类型在两个表达式中都是相同的,因此推导出的类型是相同的.

换句话说,事实是,条件操作数是true其中,在运行时,将导致表达,以评估a,是关于静态类型的分析和演绎完全不相干.


0x4*_*2D2 6

像通道说,类型max(a, b)普通类型a,并b由于条件运算(E1 ? E2 : E3)返回在第二和第三操作数的常见的类型.


T.C*_*.C. 6

他们没有,但出于不同的原因.

表达式的类型是静态构造.它不依赖于其操作数的值.如果表达式是有效的,b < a ? a : b,true ? a : b并且false ? a : b都具有相同的类型,从类型的确定ab通过一套复杂的规则,占用了标准约1.5页.

它们确实具有不同的SFINAE效果.如果传递一对实际上不支持<比较的参数,那么第一个声明将从重载解析中移除它自己,而第二个声明将很乐意接受参数,然后在实例化函数体时触发硬错误.只有当你有一个max可以接受这些参数的不同重载或者你有代码检查表达式调用的有效性时,这才真正重要max.