std::is_pointer_interconvertible_base_of
Определён в заголовочном файле <type_traits> | ||
|---|---|---|
template< class Base, class Derived > struct is_pointer_interconvertible_base_of; | (начиная с C++20) |
Если Derived однозначно является производным от Base и каждый объект Derived взаимно преобразуем по указателю со своим подобъектом Base либо если оба являются одним и тем же классом, не являющимся объединением (в обоих случаях cv-квалификация не учитывается), предоставляет константу-член value, равную true. В противном случае value равен false.
Если и Base, и Derived являются типами классов, не являющихся объединениями, и не являются одним и тем же типом (без учёта cv-квалификации), Derived должен быть полным типом; в противном случае поведение не определено.
Если программа добавляет специализации для std::is_pointer_interconvertible_base_of или std::is_pointer_interconvertible_base_of_v, поведение не определено.
Вспомогательный шаблон переменной
template< class Base, class Derived >
inline constexpr bool is_pointer_interconvertible_base_of_v =
is_pointer_interconvertible_base_of<Base, Derived>::value;
| (начиная с C++20) |
Унаследовано от std::integral_constant
Константы-члены
|
value
[static] |
true, если Derived однозначно является производным от Base и каждый объект Derived взаимно преобразуем по указателю со своим подобъектом Base либо если оба являются одним и тем же классом, не являющимся объединением (в обоих случаях cv-квалификация не учитывается); false в противном случае (открытая статическая константа-член) |
Функции-члены
|
operator bool | преобразует объект в bool, возвращает value (открытая функция-член) |
|
operator()
(C++14) | возвращает value (открытая функция-член) |
Типы-члены
| Тип | Определение |
|---|---|
value_type | bool |
type | std::integral_constant<bool,value> |
Примечания
std::is_pointer_interconvertible_base_of_v<T, U> может быть true, даже если T является закрытым или защищённым базовым классом U.
Пусть
-
U— полный объектный тип, -
T— полный объектный тип с cv-квалификацией не слабее, чем уU, -
u— любое допустимое lvalue типаU,
reinterpret_cast<T&>(u) всегда имеет корректно определённый результат, если std::is_pointer_interconvertible_base_of_v<T, U> является true.
Если T и U не являются одним и тем же типом (без учёта cv-квалификации), а T является базовым классом U, взаимно преобразуемым по указателю, то и std::is_standard_layout_v<T>, и std::is_standard_layout_v<U> являются true.
Если T является типом класса со стандартным представлением, то все базовые классы T (если они есть) являются базовыми классами T, взаимно преобразуемыми по указателю.
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_is_pointer_interconvertible | 201907L | (C++20) | Свойства взаимного преобразования по указателю:
|
Пример
#include <type_traits>
struct Foo {};
struct Bar {};
class Baz : Foo, public Bar { int x; };
class NonStdLayout : public Baz { int y; };
static_assert(std::is_pointer_interconvertible_base_of_v<Bar, Baz>);
static_assert(std::is_pointer_interconvertible_base_of_v<Foo, Baz>);
static_assert(not std::is_pointer_interconvertible_base_of_v<Baz, NonStdLayout>);
static_assert(std::is_pointer_interconvertible_base_of_v<NonStdLayout, NonStdLayout>);
int main() {}
См. также
|
(C++11) | проверяет, является ли один тип базовым классом другого типа (шаблон класса) |
|
(C++11) | проверяет, является ли тип типом класса (но не объединения) и не содержит ли он нестатических членов данных (шаблон класса) |
|
(C++11) | проверяет, является ли тип типом со стандартным представлением (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_pointer_interconvertible_base_of