std::is_pointer_interconvertible_with_class
Определено в заголовочном файле <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 является указателем-переходным с его подобъектом s.*mp. Программа неверна, если S не является полным типом.
Если S не является StandardLayoutType, или M не является типом объекта, или mp равно nullptr, результат всегда false.
Параметры
| mp | - | указатель-член для обнаружения |
Возвращаемое значение
true, если s.*mp ссылается на подобъект s и s является указателем-переходным с его подобъектом 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 является допустимым объектом типа 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 {}; // not standard-layout
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) |
проверяет, является ли тип указателем на нестатический член-объект (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_pointer_interconvertible_with_class