Spec-Zone.ru › C++

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) Свойства взаимной преобразуемости с помощью указателя:
  • std::is_pointer_interconvertible_base_of,
  • std::is_pointer_interconvertible_with_class

Пример

#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() { }

См. также

is_standard_layout
(C++11)
проверяет, является ли тип типом со стандартным размещением
(шаблон класса)
is_member_object_pointer
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API