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