C++20 Concepts能否作为布尔值使用?返回bool是标准规定吗?
C++20 Concepts相关问题解答
直接结论
- C++20 Concepts完全可以作为编译期布尔值使用
- 观察到的
decltype(std::same_as<...>)得到bool是C++20标准强制规定的行为,和具体编译器无关
详细解释
Concept的设计定义
C++标准明确规定,Concept本质是编译期布尔谓词:传入模板参数后,Concept会产出一个类型为bool的编译期纯右值常量,不存在其他返回类型的可能。
代码行为逻辑
std::same_as<int, double>不是类型,是std::same_as这个Concept模板传入两个类型参数后的求值结果,本身就是值为false的编译期bool常量。对一个bool常量取decltype,自然得到bool类型,和对字面量false取decltype的结果完全一致。
常见使用场景
Concept产出的bool常量可以用在所有需要编译期布尔值的场景,合法用法包括:
- 作为
static_assert的断言条件 - 作为
if constexpr的分支判断条件 - 作为模板的非类型参数传入
示例:
static_assert(std::same_as<int, int>); if constexpr (std::same_as<T, std::string>) { handle_string(T{}); }
和传统类型萃取的差异
可以对比C++11时代的类型萃取工具理解差异:
- 传统萃取(比如
std::is_same)是类类型,必须访问其静态成员::value才能得到bool值 - Concept是直接求值的谓词,不需要额外的取值操作,使用门槛更低
编译器一致性说明
所有符合C++20标准、支持Concept特性的编译器(包括VS2019 16.3及以上版本、GCC 10+、Clang 12+)都会对该行为给出完全一致的结果,不存在实现层面的差异。
内容的提问来源于stack exchange,提问作者zjyhjqs
相关产品推荐
相关产品推荐

