- 主题:请问一下concept。
template<class T>
constexpr bool is_meowable = true;
template<class T>
constexpr bool is_purrable() { return true; }
template<class T>
void f(T) requires is_meowable<T>; // OK
template<class T>
void g(T) requires is_purrable<T>(); // 错误,is_purrable<T>() 不是主表达式
template<class T>
void h(T) requires (is_purrable<T>()); // OK
为什么h(T) OK,,g(T) Err?有无括号什么区别?
--
FROM 117.147.21.*
(is_purrable<T>())表示evaluate这个template
不加括号不evaluate,相当于你requires后面跟了一个template
--
FROM 183.128.165.*
chatgpt解释是:
模板中的这个requires后面必须跟如下二者之一:
1、“主表达式” (primary-expression)
2、constexpr 表达式
is_purrable<T>()是函数调用,所以不是primary-expression。
(is_purrable<T>())是primary-expression。
C++中给任意expression套上(),就成为primary-expression。
什么类型的expression是primary-expression,C++规范有定义。
--
修改:z16166 FROM 114.241.228.*
FROM 114.241.228.*
感谢@z16166,@ziqin,
chatgpt比kimi,metaso,等靠谱多了。
【 在 z16166 的大作中提到: 】
: chatgpt解释是:
: 模板中的这个requires后面必须跟如下二者之一:
: 1、“主表达式” (primary-expression)
: ...................
--
FROM 117.147.21.*