C++20概念要求类型具备bool返回值成员函数报错,如何修正?
解决C++20 Concept中返回值类型约束的问题
你遇到的问题根源很明确:在C++20的concept返回值约束语法里,直接写bool是不合法的——这里要求的必须是一个类型约束(type constraint),也就是得是一个concept,不能直接用原始类型。
两种正确的实现方式
1. 严格要求成员函数返回值就是bool
如果你需要确保t.foo()的返回值完全是bool类型(不接受其他可转换为bool的类型),可以用<concepts>头文件里的std::same_as概念:
#include <concepts> #include <cassert> template <typename T> concept testable = requires(T t) { { t.foo() } -> std::same_as<bool>; // 用std::same_as<bool>作为类型约束 }; class A { public: bool foo() const { return true; } }; template<testable T> void verify(const T& t) { assert(t.foo()); } int main(void) { A a; verify(a); return 0; }
2. 允许返回可隐式转换为bool的类型
如果你的场景更灵活,希望接受返回值能隐式转成bool的类型(比如int、char、std::optional<bool>等),可以使用std::convertible_to<bool>:
#include <concepts> #include <cassert> template <typename T> concept testable = requires(T t) { { t.foo() } -> std::convertible_to<bool>; // 支持所有可转bool的类型 }; // 这个类也能满足约束,因为int可以隐式转bool class B { public: int foo() const { return 1; } }; template<testable T> void verify(const T& t) { assert(t.foo()); } int main(void) { A a; verify(a); B b; verify(b); // 这行也能正常编译 return 0; }
补充说明
C++20的返回类型约束语法{ expr } -> constraint里,constraint必须是一个概念(concept),或者是带概念修饰的类型(比如std::integral auto)。直接写bool不符合语法规则,所以编译器会抛出“bool不是类型约束”的错误。
另外要确认编译器已正确开启C20支持:g10需要添加编译选项-std=c++20,Visual Studio 2019要在项目设置里选择C++20标准(或/std:c++latest选项)。
内容的提问来源于stack exchange,提问作者Topological Sort
相关产品推荐
相关产品推荐

