C++ 函数声明中作为类型名的概念在C+中有效吗+;20?

C++ 函数声明中作为类型名的概念在C+中有效吗+;20?,c++,c++20,c++-concepts,C++,C++20,C++ Concepts,下面的代码在gcc和clang(trunk with-std=c++20)上编译良好,但在msvc(19.27/std:c++最新版本)上编译错误 模板 概念子表=需要(T lhs,T rhs){lhs-rhs;}; 自动子表(子表自动x、子表自动y){ 返回x-y; } int main(){ const auto z=sub(4,5); } 以上代码在C++20中应该是有效的,它在concepts-ts中。这是微软落后于其他实现的情况吗?(毕竟,C++20还没有问世)或者说它还没有成为20

下面的代码在gcc和clang(trunk with-std=c++20)上编译良好,但在msvc(19.27/std:c++最新版本)上编译错误

模板
概念子表=需要(T lhs,T rhs){lhs-rhs;};
自动子表(子表自动x、子表自动y){
返回x-y;
}
int main(){
const auto z=sub(4,5);
}

以上代码在C++20中应该是有效的,它在concepts-ts中。这是微软落后于其他实现的情况吗?(毕竟,C++20还没有问世)或者说它还没有成为20?

在C++20中,概念不能用来代替类型名。然而,这不是您的代码所做的。通过声明参数的类型以使用占位符类型
auto
,可以使用缩写函数模板语法。可以通过将类型概念名称应用于
auto
声明的参数来约束缩写函数模板(VS的某些版本尚未实现缩写函数模板语法)


但这不是概念TS中使用的语法,类型概念将替换类型名。

“它在概念TS中”不,不是。@Nicolas不是吗?该死,我发誓我在什么地方读到过。那么为什么它是在gcc和clang中呢?不是用那种语法,它不是。C++20标准从9月4日起就已经是最终形式,并将在年底(可能是12月)正式发布。对,所以
模板
?@Firefly:这是一个模板参数,不是函数参数。模板参数可以做到这一点;函数参数不能为空。这样的模板参数声明
T
为类型名;函数参数是一个变量。他们不是一回事。模板参数也可以执行
Template
,这允许推断变量
,受
type\u概念
的约束。对不起,我认为我使用的术语是错误的,我理解了变量和类型名之间的区别,我在问你所谓的“替换类型名”是否就是这个意思。我不知道它可以做到这一点,但我知道“缩写函数模板”(只是不知道它们的名称)。所以
template
就像
template
?其中,
int
是指满足
type\u概念的任何内容