And*_*owl 11 c++ templates overloading sfinae c++11
考虑这个功能模板:
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
Run Code Online (Sandbox Code Playgroud)
在T从调用中的第一个参数的类型推导出类型之后foo(),编译器将继续替换T并实例化函数签名.
如果首先执行返回类型的替换,导致简单的替换失败,编译器将在计算过载集并搜索其他可行的重载(SFINAE)时丢弃此函数模板.
另一方面,如果首先发生第二个函数参数的替换,导致硬错误(例如,由于非直接上下文中的替换失败),则整个编译将失败.
问题: 对于函数参数和返回类型的替换顺序是否有任何保证?
注意: 此示例似乎表明在所有主要编译器(VC11已单独测试并给出相同结果)上,在替换参数类型之前会替换返回类型.
And*_*owl 14
[注意:这本来不是一个自我回答的问题,但我碰巧在制作问题时找到解决方案]
对于函数参数和返回类型的替换顺序是否有任何保证?
不符合现行标准.
但是,这份缺陷报告(由Xeo提供)表明,确实是这样的.以下是C++ 11标准第14.8.2/7段的新措辞(已成为n3485草案的一部分):
替换发生在函数类型和模板参数声明中使用的所有类型和表达式中.表达式不仅包括常量表达式,例如出现在数组边界中的常量表达式,还包括非类型模板参数,还包括sizeof,decltype和允许非常量表达式的其他上下文中的通用表达式(即非常量表达式).替换以词汇顺序进行,并在遇到导致演绎失败的条件时停止.[...]
正如Nicol Bolas在对问题的评论中正确指出的那样,词汇顺序意味着在参数类型之后将替换尾随返回类型,如本实例所示.
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |