Пространства имён
Варианты
Действия

std::is_pointer_interconvertible_with_class

Материал из cppreference.com
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
<tbody> </tbody>
Определено в заголовочном файле <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 {}; // нестандартная компоновка

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

Смотрите также

проверяет, является ли тип типом со стандартной компоновкой
(шаблон класса) [править]
проверяет, является ли тип указателем на нестатический объект-элемент
(шаблон класса) [править]