考虑这个函数模板:
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
T
在从调用的第一个参数的类型推导出类型之后foo()
,编译器将继续替换T
并实例化函数签名。
如果首先执行返回类型的替换,导致简单的替换失败,编译器将在计算重载集并搜索其他可行重载 (SFINAE) 时丢弃此函数模板。
另一方面,如果对第二个函数参数的替换首先发生,导致硬错误(例如,由于在非立即上下文中的替换失败),则整个编译将失败。
问题: 对函数参数和返回类型执行替换的顺序是否有任何保证?
注意: 这个例子似乎表明,在所有主要编译器(VC11 单独测试并给出相同的结果)上,返回类型的替换发生在参数类型的替换之前。