考虑这个函数模板:扣除类型后,函数模板中的替换顺序是否有保证?
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
从调用foo()
的第一个参数的类型推断类型T
后,编译器会进行替代T
和实例函数签名。
如果首先执行替换返回类型,导致简单替换失败,则编译器将在计算重载集合并搜索其他可行超载(SFINAE)时放弃此函数模板。另一方面,如果第一个函数参数的替换先发生,导致硬错误(例如,由于非直接上下文中的替换失败),则整个编译将失败。
问题:对函数参数和返回类型进行替换的顺序是否有保证?
注:This example似乎表明,在所有主要的编译器(VC11是单独测试,并给了相同的结果)取代的返回类型替代参数类型之前发生。
请注意,[迟到指定返回类型会改变事物](http://liveworkspace.org/code/4cvdpz%2464)。 – 2013-03-17 15:29:19
@NicolBolas:对,这是因为替代实际上是要按照词汇顺序发生 - 顺便说一句Xeo正确地指出,这不是现行标准规定的行为,所以我更正了我的答案 – 2013-03-17 15:33:09