考虑这个函数模板:
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
推导类型之后T
在呼叫从第一个参数的类型foo()
则编译器将继续进行以替代T
和实例化函数签名。
如果返回类型替代最先被执行,导致一个简单的替换失败,编译器会计算过载集时丢弃这个函数模板和搜索其他可行的重载(SFINAE)。
在另一方面,如果替代所述第二函数参数先发生,引起(因为在非直接上下文的取代故障例如)硬错误,整个编译会失败。
问: 是否有在替代将为功能参数执行和返回类型的顺序任何保证?
注意: 这个例子似乎表明,在所有主要的编译器(VC11是单独测试,并给了相同的结果)替代参数类型之前发生替代的返回类型。
[注:这不是原本的意思是自我回答的问题,但我偶然发现了解决方案,同时各具特色的问题]
有没有在替代将用于功能参数来执行和返回类型的顺序任何保证?
在当前的标准。
然而, 这种缺陷报告 (礼貌XEO )表明,这确实是有意如此。 下面是段落的C ++ 11标准(这已成为的一部分的14.8.2 / 7所提出的新的措词n3485草案 ):
所述取代发生在所有类型和表达了在函数类型并在模板参数声明使用。 表达式不仅包括常量表达式如那些出现在数组边界或无类型模板参数,而且内部的sizeof,decltype一般表达式(即,非常量表达式),和其它上下文允许非常量表达式。 取代进入词汇顺序且遇到使得扣失败的条件时停止 。 [...]
由于正确地指出通过尼科尔流星锤评价的问题, 词汇顺序意味着一个后返回类型将参数类型之后被取代,如图这个活例子 。
文章来源: Is there any guarantee on the order of substitution in a function template after type deduction?