我来到know https://stackoverflow.com/a/74024419一个班级的X
具有名为的成员函数func
,c++标准不允许我们写decltype(X::func)
。因此我预计下面给出的程序会产生一个错误,类似于invalid use of non-static member function
。但令我惊讶的是,该计划compiles https://godbolt.org/z/Ma67TTs5e与所有 3 个编译器一起使用。
#include <iostream>
#include <type_traits>
#include <concepts>
template < typename T >
concept test = std::same_as <decltype(T::func), int(int) >;
struct D
{
int func(int);
};
int main()
{
std::cout << test<D>;
}
上述程序由所有 3 个编译器编译。通过查看 [expr.prim.id],程序似乎格式不正确,并且应该发出诊断信息。但没有一个编译器提供任何错误。那么,使用concept
以程序中所示的方式使程序格式良好,还是仍然格式错误,并且所有编译器都错误吗?
按照程序中所示的方式使用概念是否使程序格式良好
该计划是格式良好的如下所述。来自[temp.constr.normal]:
表达式 E 的范式是一个约束 (13.5.2),定义如下:
- 概念 ID C 的范式是约束表达式的范式
C的,将参数中的A1,A2,...,An替换为C各自的模板参数后
每个原子约束中的映射。如果任何此类替换导致无效的类型或表达式,
该程序格式不正确;无需诊断。
(强调我的)
注意最后一句的强调。特别是,它是关于参数映射。也就是说,如果参数映射导致类型无效,则只有程序是 IFNDR。
但在您给定的示例中,参数映射是T ->decltype(T::func)
它本身并不是无效类型。因此,上述引用的参考文献并不满足。
现在,来自 [temp.constr.atomic#3]:
要确定是否满足原子约束,参数映射和模板实参首先被替换到其表达式中。
如果替换导致无效类型或表达式,则不满足约束。否则,如有必要,将执行左值到右值的转换,并且 E 应为 bool 类型的常量表达式。
当且仅当 E 的计算结果为真时,约束才被满足。
如果在程序的不同点,对于相同的原子约束和模板参数,满足结果不同,则该程序是格式错误的,不需要诊断。
(强调我的)
由于替换了模板参数D
导致无效的构造decltype(D::func)
,给定的约束不满足(意味着它是false
).
所有的编译器都错了吗?
因此,所有编译器都正确接受程序并输出0
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)