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 {}; // нестандартная компоновка
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) |
проверяет, является ли тип указателем на нестатический объект-элемент (шаблон класса) |