requires表达式是否对非法代码返回TRUE?下述可编译代码是否符合预期?
C++ requires表达式相关问题解答
问题1:requires表达式是否会对格式错误的代码返回TRUE?
不会。requires表达式只负责检查代码的语法合法性与名称查找有效性,如果代码存在格式错误(比如语法错误、未定义符号等),会直接导致编译失败,而非返回true。只有当代码在语法层面完全合法,且满足约束条件时,requires才会返回true。
问题2:下述代码能够成功编译,这是否符合预期?如果符合,原因是什么?此时requires关键字检查的内容是什么?
示例代码
template <int I> void f() { static_assert(I); } int main() { static_assert(requires{f<0>();}); }
这段代码能成功编译是完全符合预期的,原因如下:
- requires表达式的检查属于浅层次的语法验证,它不会执行表达式内部的代码,也不会触发模板的实例化。
- 这里
requires{f<0>();}仅检查f<0>()这个调用是否在语法上合法:f是接收int类型模板参数的函数模板,传入0作为模板实参是合法的,函数调用的语法也没有问题。而f<0>()内部的static_assert(I)只有在模板被实际实例化时才会触发,requires表达式不会触发这一步,所以这个静态断言不会被执行,自然不会导致编译错误。
此时requires关键字检查的核心内容是:f<0>()这个函数调用是否具备语法合法性——包括模板实参与模板参数的类型匹配、函数调用的语法正确,不存在语法或名称查找层面的错误。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

