C++20 概念语法——requires 参数变量是什么意思?
C++20 concept syntax - what does the requires parameter variables mean?
很多文章都举了这样的例子:
template<typename T>
concept Equal = requires(T a, T b) {
{ a == b } -> std::same_as<bool>;
};
如果我写:
有什么不同吗
template<typename T>
concept Equal = requires(T a) {
{ a == a } -> std::same_as<bool>;
};
如果不是,为什么语法设计成这样?为什么他们要我声明这些变量,例如 a
或 b
?
为什么我需要多个相同类型的变量?为什么我什至需要变量?
template<typename T>
concept Equal = requires {
{ declval<const T&>() == declval<const T&>() }
-> std::same_as<bool>;
};
Why do they ask me to declare these variables like a or b? Why not even something like..
不会要求或要求您使用这些变量。给你 选项 因为它更易读。就检查约束而言,差别不大。
文章之所以给出您引用的例子,是因为 人类 更容易理解。 Equal
概念被定义为“给定两个这种类型的假设对象,我们可以用它们编写一个比较表达式,结果是 bool
”。而已。您没有使用此表示法,您可以根据需要将其写得尽可能详细。
但是关于代码的古老智慧仍然存在。代码的意义远不止于书写,而且不仅仅是以我们预见的方式。当您的概念在导致编译器错误的上下文中不满足时,编译器可能会在其错误消息中包含该约束。哪个版本的概念会产生 easier-to-understand 错误消息?我打赌使用辅助变量。
很多文章都举了这样的例子:
template<typename T>
concept Equal = requires(T a, T b) {
{ a == b } -> std::same_as<bool>;
};
如果我写:
有什么不同吗template<typename T>
concept Equal = requires(T a) {
{ a == a } -> std::same_as<bool>;
};
如果不是,为什么语法设计成这样?为什么他们要我声明这些变量,例如 a
或 b
?
为什么我需要多个相同类型的变量?为什么我什至需要变量?
template<typename T>
concept Equal = requires {
{ declval<const T&>() == declval<const T&>() }
-> std::same_as<bool>;
};
Why do they ask me to declare these variables like a or b? Why not even something like..
不会要求或要求您使用这些变量。给你 选项 因为它更易读。就检查约束而言,差别不大。
文章之所以给出您引用的例子,是因为 人类 更容易理解。 Equal
概念被定义为“给定两个这种类型的假设对象,我们可以用它们编写一个比较表达式,结果是 bool
”。而已。您没有使用此表示法,您可以根据需要将其写得尽可能详细。
但是关于代码的古老智慧仍然存在。代码的意义远不止于书写,而且不仅仅是以我们预见的方式。当您的概念在导致编译器错误的上下文中不满足时,编译器可能会在其错误消息中包含该约束。哪个版本的概念会产生 easier-to-understand 错误消息?我打赌使用辅助变量。