Spec-Zone.ru › C++

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) Свойства взаимного преобразования по указателю:
  • std::is_pointer_interconvertible_base_of,
  • std::is_pointer_interconvertible_with_class

Пример

#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() {}

См. также

is_base_of
(C++11)
проверяет, является ли один тип базовым классом другого типа
(шаблон класса)
is_empty
(C++11)
проверяет, является ли тип типом класса (но не объединения) и не содержит ли он нестатических членов данных
(шаблон класса)
is_standard_layout
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API