std:: is_pointer_interconvertible_base_of
|
Определено в заголовочном файле
<type_traits>
|
||
|
template
<
class
Base,
class
Derived
>
struct is_pointer_interconvertible_base_of ; |
(начиная с C++20) | |
Если
Derived
однозначно наследуется от
Base
и каждый объект
Derived
является
pointer-interconvertible
со своим подобъектом
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
=
|
(начиная с C++20) | |
Унаследовано от std:: integral_constant
Константы-члены
|
value
[static]
|
true
если
Derived
однозначно наследуется от
Base
и каждый объект
Derived
является
pointer-interconvertible
со своим подобъектом
Base
, или если оба являются одним и тем же не-объединением (в обоих случаях игнорируя cv-квалификаторы),
false
в противном случае
(public static member constant) |
Функции-члены
|
operator bool
|
преобразует объект в
bool
, возвращает
value
(public member function) |
|
operator()
(C++14)
|
возвращает
value
(public member function) |
Типы-члены
| Тип | Определение |
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)
|
проверяет, является ли тип
стандартным расположением
(шаблон класса) |