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/w/cpp/types/is_pointer_interconvertible_base_of

Spec-Zone.ru

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