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 не определено.
Вспомогательная шаблонная переменная
<tbody> </tbody> 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 иначе (public static константа-элемент) |
Функции-элементы
operator bool |
преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) |
возвращает value (public функция-элемент) |
Типы элементы
| Тип | Определение |
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) |
проверяет, является ли тип типом со стандартной компоновкой (шаблон класса) |