我试图理解指定 C++ require 子句的不同方式。我需要一些更深入的理解,而不是指定约束的技术解决方案。
想一个模板函数:
template<typename T>
T func(T t) {
return t;
}
可以添加一个简单但无用的 require 子句:
template<typename T>
requires true
T func(T t) {
return t;
}
我可以这样调用这个函数:
foo(1);
据我了解https://en.cppreference.com/w/cpp/language/constraints#Requires_clauses我还可以使用常量 lambda 表达式,因为 lambda 表达式也是主要表达式(https:// en.cppreference.com/w/cpp/language/expressions#Primary_expressions)。
template<typename T>
requires [] { return true; }
T func(T t) {
return t;
}
使用 VS2019 / VS2022 中的 cl.exe 我收到类似于(翻译)的编译错误:
错误 C7607:原子约束必须是 Bool 类型的常量表达式...
我尝试使用
constexpr
但没有成功。
我做什么不想要:
requires ([] { return true; }())
lambda 表达式的类型是由编译器确定的类类型。 lambda 返回什么并不重要,除非您实际调用 lambda。
类类型不是布尔类型。由于标准要求requires
子句中的表达式是布尔类型的常量表达式。您可以将 lambda 表达式设为常量表达式,但不能将其设为布尔类型。