类型推导后函数模板中的替换顺序是否有保证?

2024-04-26

考虑这个函数模板:

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(使用前将#替换为@)

类型推导后函数模板中的替换顺序是否有保证? 的相关文章

随机推荐