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 не является 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) Свойства указателей-переходных:
  • 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/w/cpp/types/is_pointer_interconvertible_with_class

Spec-Zone.ru

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