【发布时间】:2026-01-10 12:50:01
【问题描述】:
C++ 标准 14.8.2$7 说:
替换发生在函数类型和模板参数声明中使用的所有类型和表达式中。表达式不仅包括常量表达式,例如出现在数组边界或作为非类型模板参数的常量表达式,还包括
sizeof、decltype和其他允许非常量表达式的上下文中的通用表达式(即非常量表达式) .替换按词汇顺序进行,并在遇到导致演绎失败的条件时停止。 [注意:异常规范中的等效替换仅在异常规范被实例化时进行,此时如果替换导致无效的类型或表达式,则程序是非良构的。 ——尾注]
该标准在这里提供了一个示例:
template <class T> struct A { using X = typename T::X; };
template <class T> typename T::X f(typename A<T>::X);
template <class T> void f(...) { }
template <class T> auto g(typename A<T>::X) -> typename T::X;
template <class T> void g(...) { }
void h() {
f<int>(0); // OK, substituting return type causes deduction to fail
g<int>(0); // error, substituting parameter type instantiates A<int>
}
为什么在这里调用g<int>(0) 会出错?尾随返回类型T::X 不会导致替换失败吗?模板函数f和g有什么区别?
【问题讨论】:
标签: c++ substitution