Namespaces
Variants
Actions

std::derived_from

From cppreference.com
< cpp‎ | concepts
Defined in header <concepts>
template<class Derived, class Base >

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

    std::is_convertible_v<constvolatile Derived*, constvolatile Base*>;
(since C++20)

The concept derived_from<Derived, Base> is satisfied if and only if Base is a class type that is either Derived or a public and unambiguous base of Derived, ignoring cv-qualifiers.

Note that this behavior is different to std::is_base_of when Base is a private or protected base of Derived.

[edit]Example

#include <concepts>   class A {};   class B :public A {};   class C :private A {};   // std::derived_from == true only for public inheritance or exact same class static_assert(std::derived_from<B, B>==true);// same class: true static_assert(std::derived_from<int, int>==false);// same primitive type: false static_assert(std::derived_from<B, A>==true);// public inheritance: true static_assert(std::derived_from<C, A>==false);// private inheritance: false   // std::is_base_of == true also for private inheritance static_assert(std::is_base_of_v<B, B>==true);// same class: true static_assert(std::is_base_of_v<int, int>==false);// same primitive type: false static_assert(std::is_base_of_v<A, B>==true);// public inheritance: true static_assert(std::is_base_of_v<A, C>==true);// private inheritance: true   int main(){}

[edit]References

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

[edit]See also

(C++11)
checks if a type is a base of the other type
(class template)[edit]
checks if a type can be converted to the other type
(class template)[edit]
close