std:: is_pointer_interconvertible_with_class
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<type_traits>
|
||
|
template
<
class
S,
class
M
>
constexpr bool is_pointer_interconvertible_with_class ( M S :: * mp ) noexcept ; |
(начиная с C++20) | |
Для объекта
s
типа
S
определяет, ссылается ли
s.
*
mp
на подобъект
s
и является ли
s
pointer-interconvertible
со своим подобъектом
s.
*
mp
. Программа является некорректной, если
S
не является
complete type
.
Если
S
не является
StandardLayoutType
, или
M
не является объектным типом, или
mp
равен
nullptr
, результат всегда
false
.
Содержание |
Параметры
| mp | - | указатель-на-член для определения |
Возвращаемое значение
true
если
s.
*
mp
ссылается на подобъект
s
и
s
является pointer-interconvertible со своим подобъектом
s.
*
mp
, иначе
false
, где
s
является объектом типа
S
.
Примечания
Тип выражения указателя-на-член
&
S
::
m
не всегда является
M S
::
*
, где
m
имеет тип
M
, поскольку
m
может быть членом, унаследованным от базового класса
S
. Аргументы шаблона могут быть указаны для предотвращения потенциально неожиданных результатов.
Если существует значение
mp
типа
M S
::
*
такое, что
std
::
is_pointer_interconvertible_with_class
(
mp
)
==
true
, тогда
reinterpret_cast
<
M
&
>
(
s
)
имеет определенный результат и ссылается на тот же подобъект, что и
s.
*
mp
, где
s
является корректным lvalue типа
S
.
На общих платформах битовая карта
mp
полностью нулевая, если
std
::
is_pointer_interconvertible_with_class
(
mp
)
==
true
.
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_is_pointer_interconvertible
|
201907L
|
(C++20) |
Признаки взаимопреобразуемости указателей:
|
Пример
#include <type_traits> struct Foo { int x; }; struct Bar { int y; }; struct Baz : Foo, Bar {}; // не стандартная компоновка static_assert( not std::is_same_v<decltype(&Baz::x), int Baz::*> ); static_assert( std::is_pointer_interconvertible_with_class(&Baz::x) ); static_assert( not std::is_pointer_interconvertible_with_class<Baz, int>(&Baz::x) ); int main() { }
Смотрите также
|
(C++11)
|
проверяет, является ли тип
стандартным размещением
(шаблон класса) |
|
(C++11)
|
проверяет, является ли тип указателем на нестатический член-объект
(шаблон класса) |