Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::is_poi...e_with_class(3) C++ Standard Libarystd::is_poi...e_with_class(3)

NAME
       std::is_pointer_interconvertible_with_class - std::is_pointer_intercon-
       vertible_with_class

Synopsis
	  Defined in header <type_traits>
	  template<class S, class M>
	  constexpr  bool  is_pointer_interconvertible_with_class( M S::* mp )
       (since C++20)
	  noexcept;

	  Given	an object s of type S, determines whether s.*mp	 refers	 to  a
       subobject of s and
	  s  is	pointer-interconvertible with its subobject s.*mp. The program
       is ill-formed if
	  S is not a complete type.

	  If S is not a	StandardLayoutType, or M is not	an object type,	or  mp
       is equal	to
	  nullptr, the result is always	false.

Parameters
	  mp - a pointer-to-member to detect

Return value
	  true if s.*mp	refers a subobject of s	and s is pointer-interconvert-
       ible with its
	  subobject s.*mp, otherwise false, where s is an object of type S.

Notes
	  The  type  of	 a  pointer-to-member expression &S::m is not always M
       S::*, where m is	of
	  type M, because m may	be a member inherited from a base class	of  S.
       The template
	  arguments  can be specified in order to avoid	potentially surprising
       results.

	  If there is a	value mp of type M S::*	such that
	  std::is_pointer_interconvertible_with_class(mp) == true, then
	  reinterpret_cast<M&>(s) has well-defined result and  it  refers  the
       same subobject as
	  s.*mp, where s is a valid lvalue of type S.

	  On common platforms, the bit pattern of mp is	all zero if
	  std::is_pointer_interconvertible_with_class(mp) == true.

	  Feature-test macro: __cpp_lib_is_pointer_interconvertible

Example
       // Run this code

	#include <type_traits>
	#include <iostream>

	struct Foo { int x; };
	struct Bar { int y; };

	struct Baz : Foo, Bar {}; // not standard-layout

	int main()
	{
	    std::cout << std::boolalpha
		<< std::is_same_v<decltype(&Baz::x), int Baz::*> << '\n'
		<<   std::is_pointer_interconvertible_with_class(&Baz::x)   <<
       '\n'
		<<	      std::is_pointer_interconvertible_with_class<Baz,
       int>(&Baz::x) <<	'\n';
	}

Output:
	false
	true
	false

See also
	  is_standard_layout	   checks if a type is a standard-layout type
	  (C++11)		   (class template)
	  is_member_object_pointer checks if a type is a pointer to a non-sta-
       tic member object
	  (C++11)		   (class template)

http://cppreference.com		  2022.07.31	 std::is_poi...e_with_class(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::is_pointer_interconvertible_with_class&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help