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 не является типом со стандартным размещением, или 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 — допустимое 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 {}; // 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/cpp/types/is_pointer_interconvertible_with_class