考虑这个函数模板:
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
推导类型后T
从调用中第一个参数的类型foo()
,编译器将继续替换T
并实例化函数签名。
如果首先执行返回类型的替换,导致简单的替换失败,编译器将在计算重载集时丢弃此函数模板并搜索其他可行的重载(SFINAE)。
另一方面,如果首先发生第二个函数参数的替换,导致硬错误(例如,由于非立即上下文中的替换失败),则整个编译将失败。
问题: 函数参数和返回类型的替换顺序是否有保证?
NOTE: 这个例子 http://liveworkspace.org/code/4cvdpz%2464似乎表明,在所有主要编译器上(VC11 单独测试并给出相同的结果)返回类型的替换发生在参数类型的替换之前。
[注:这本来不是一个自我回答的问题,但我碰巧在提出问题时找到了解决方案]
函数参数和返回类型的替换顺序是否有保证?
现行标准中没有。
然而,本缺陷报告 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1227(由Xeo https://stackoverflow.com/u/500104)表明这确实是有意为之。以下是 C++11 标准第 14.8.2/7 段的拟议新措辞(已成为 C++11 标准的一部分)n3485 草案 http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf):
替换发生在函数类型和模板中使用的所有类型和表达式中
参数声明。这些表达式不仅包括常量表达式,例如出现在
数组边界或作为非类型模板参数,但也可以是通用表达式(即非常量表达式)
在 sizeof、decltype 和其他允许非常量表达式的上下文中。替换进行
按词法顺序排列,遇到导致推导失败的条件时停止. [...]
正如正确指出的尼可波拉斯 https://stackoverflow.com/users/734069/nicol-bolas在对该问题的评论中,词汇顺序意味着尾部返回类型将被替换after参数类型,如图所示这个活生生的例子 http://liveworkspace.org/code/4cvdpz%2464.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)