在类型演绎之后,函数模板中的替换顺序是否有任何保证
Is there any guarantee on the order of substitution in a function template after type deduction?
考虑这个函数模板:
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
从调用foo()
的第一个参数的类型推断出T
类型后,编译器将替换T
并实例化函数签名。
如果首先执行对返回类型的替换,导致简单的替换失败,编译器将在计算重载集并搜索其他可行的重载(SFINAE)时丢弃该函数模板。
另一方面,如果先对第二个函数参数进行替换,导致硬错误(例如,由于在非立即上下文中替换失败),则整个编译将失败。
问题:是否保证函数参数和返回类型的替换顺序?
注意:这个例子似乎表明,在所有主要的编译器(VC11分别测试并给出相同的结果)中,替换返回类型发生在替换参数类型之前。
[注:这本来不是一个自我回答的问题,但我碰巧在构思这个问题的时候找到了解决方案]
是否保证函数参数和返回类型的替换顺序?
不在当前标准中。
然而,这个缺陷报告(由Xeo提供)表明这确实是有意为之。以下是c++ 11标准(已成为n3485草案的一部分)第14.8.2/7段的拟议新措辞:
替换发生在函数类型和模板中使用的所有类型和表达式中参数声明。表达式不仅包括常量表达式,如中出现的常量表达式数组边界或作为非类型模板参数,也可以作为通用表达式(即非常量表达式)。在sizeof、decltype和其他允许非常量表达式的上下文中。替换继续并在遇到导致演绎失败的条件时停止。[…]
正如Nicol Bolas在问题的注释中正确指出的那样,词法顺序意味着将在参数类型之后替换尾随的返回类型,如本例所示。
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 如何用转义符替换字符串中的所有特殊字符
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- QML按钮点击功能执行顺序
- C++中数据类型修饰符的顺序
- 当比特(而不是字节)的顺序至关重要时的持久性
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++ 替换字节数组中项的顺序
- 函数模板实例化、替换和重载解析的顺序是什么?
- 替换decorator模式以强制执行创建顺序
- 为什么模板参数替换的顺序很重要
- 在类型演绎之后,函数模板中的替换顺序是否有任何保证