std::derived_from (C++20 起)

来自cppreference.com
< cpp‎ | concepts
在标头 <concepts> 定义
template< class Derived, class Base >

concept derived_from =
    std::is_base_of_v<Base, Derived> &&

    std::is_convertible_v<const volatile Derived*, const volatile Base*>;
(C++20 起)

概念 derived_from<Derived, Base> 当且仅当忽略 cv 限定符后 Base 是类类型,且它为 Derived 或是 Derived 的公开无歧义基类才得到满足。

注意当 BaseDerived 的私有或受保护基类时,此行为异于 std::is_base_of

示例

#include <concepts>
 
class A {};
 
class B : public A {};
 
class C : private A {};
 
// std::derived_from == true 仅对公有继承或完全相同的类(非基础类型)成立
static_assert(std::derived_from<B, B> == true);      // 相同的类: true
static_assert(std::derived_from<int, int> == false); // 相同的基础类型: false
static_assert(std::derived_from<B, A> == true);      // 公有继承: true
static_assert(std::derived_from<C, A> == false);     // 私有继承: false
 
// std::is_base_of == true 对私有继承也成立,但仍对完全相同的基础类型不成立
static_assert(std::is_base_of_v<B, B> == true);      // 相同的类: true
static_assert(std::is_base_of_v<int, int> == false); // 相同的基础类型: false
static_assert(std::is_base_of_v<A, B> == true);      // 公有继承: true
static_assert(std::is_base_of_v<A, C> == true);      // 私有继承: true
 
int main() {}

引用

  • C++23 标准(ISO/IEC 14882:2024):
  • 18.4.3 Concept derived_from [concept.derived]
  • C++20 标准(ISO/IEC 14882:2020):
  • 18.4.3 Concept derived_from [concept.derived]

参阅

检查一个类型是是另一个类型的基类
(类模板)
检查是否能转换一个类型为另一类型
(类模板)