std::derived_from
From cppreference.com
Defined in header <concepts> | ||
template<class Derived, class Base > concept derived_from = | (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
Run this code
#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]
- 18.4.3 Concept
- C++20 standard (ISO/IEC 14882:2020):
- 18.4.3 Concept
derived_from
[concept.derived]
- 18.4.3 Concept
[edit]See also
(C++11) | checks if a type is a base of the other type (class template) |
(C++11)(C++20) | checks if a type can be converted to the other type (class template) |