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