require子句是在声明中的参数替换之后计算的吗? 在C++标准中,N4618/[ TEMP.DEFITT](Pr.14.2),下面的例子(专利号:14.2席/ 7)演示了模板参数替换是如何按词序执行的: 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> } 模板结构A{using X=typename T::X;}; 模板类型名T::X f(类型名A::X); 模板无效f(…){} 模板自动g(typename A::X)->typename T::X; 模板无效g(…){} void h(){ f(0);//好,替换返回类型会导致推断失败 g(0);//错误,替换参数类型会实例化 }

require子句是在声明中的参数替换之后计算的吗? 在C++标准中,N4618/[ TEMP.DEFITT](Pr.14.2),下面的例子(专利号:14.2席/ 7)演示了模板参数替换是如何按词序执行的: 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> } 模板结构A{using X=typename T::X;}; 模板类型名T::X f(类型名A::X); 模板无效f(…){} 模板自动g(typename A::X)->typename T::X; 模板无效g(…){} void h(){ f(0);//好,替换返回类型会导致推断失败 g(0);//错误,替换参数类型会实例化 },c++,c++-concepts,C++,C++ Concepts,我希望在声明内容之前还需要评估条款内容。我预计以下修改不会产生任何编译错误: 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> requires f

我希望在声明内容之前还需要评估条款内容。我预计以下修改不会产生任何编译错误:

 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>
 requires false
 auto g(typename A<T>::X) -> typename T::X;
 template <class T> 
 requires true
 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>
}
模板结构A{using X=typename T::X;};
模板类型名T::X f(类型名A::X);
模板无效f(…){}
模板
需要假
自动g(typename A::X)->typename T::X;
模板
要求真实
void g(…){}
void h(){
f(0);//好,替换返回类型会导致推断失败
g(0);//错误,替换参数类型会实例化
}
事实上,GCC告诉我仍然有一个错误。这是概念TS中所述的行为吗?

是。参见[临时扣减]/5中的注释:

满足与功能相关的约束条件(14.10) 模板专门化是在重载解析期间确定的 (13.3),而不是在替代点


我一直在寻找这个标准版本。你能给我一个能找到它的地方的链接吗?我正在使用概念。。。我需要它。谢谢。@Oliv添加了一个链接。