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

FreeBSD Manual Pages

  
 
  

home | help
std::is_layout_compatible(3)  C++ Standard Libary std::is_layout_compatible(3)

NAME
       std::is_layout_compatible - std::is_layout_compatible

Synopsis
	  Defined in header <type_traits>
	  template< class T, class U >	   (since C++20)
	  struct is_layout_compatible;

	  If T and U are layout-compatible types, provides the member constant
       value equal to
	  true.	Otherwise value	is false.

	  Every	 type is layout-compatible with	its any	cv-qualified versions,
       even if it is
	  not an object	type.

	  T and	U shall	each be	a complete type, (possibly cv-qualified) void,
       or an array of
	  unknown bound. Otherwise, the	behavior is undefined.

	  If an	instantiation of a template above depends, directly  or	 indi-
       rectly, on an
	  incomplete  type, and	that instantiation could yield a different re-
       sult if that type
	  were hypothetically completed, the behavior is undefined.

	  The behavior of a program  that  adds	 specializations  for  is_lay-
       out_compatible or
	  is_layout_compatible_v is undefined.

	 Helper	variable template

	  template< class T, class U >
	  inline       constexpr       bool	 is_layout_compatible_v	     =
       (since C++20)
	  is_layout_compatible<T, U>::value;

       Inherited from std::integral_constant

Member constants
	  value	   true	if T and U are layout-compatible, false	otherwise
	  [static] (public static member constant)

Member functions
	  operator bool	converts the object to bool, returns value
			(public	member function)
	  operator()	returns	value
	  (C++14)	(public	member function)

Member types
	  Type	     Definition
	  value_type bool
	  type	     std::integral_constant<bool, value>

Notes
	  A signed integer type	and its	unsigned counterpart are  not  layout-
       compatible. char
	  is layout-compatible with neither signed char	nor unsigned char.

	  Similar  types  are  not  layout-compatible if they are not the same
       type after ignoring
	  top-level cv-qualification.

	  An enumeration type and its underlying type are not  layout-compati-
       ble.

	  Array	types of layout-compatible but different element types (ignor-
       ing
	  cv-qualification)  are  not  layout-compatible,  even	if they	are of
       equal length.

	  Feature-test macro: __cpp_lib_is_layout_compatible

Example
       // Run this code

	#include <type_traits>
	#include <iomanip>
	#include <iostream>

	struct Foo {
	    int	x;
	    char y;
	};

	class Bar {
	    const int u	= 42;
	    volatile char v = '*';
	};

	enum E0	: int {};
	enum class E1 :	int {};

	#define	SHOW(...) std::cout << std::setw(54) <<	#__VA_ARGS__ <<	" =  "
       << __VA_ARGS__ << '\n'

	int main()
	{
	    std::cout << std::boolalpha	<< std::left;
	    SHOW(std::is_layout_compatible_v<const void, volatile void>);
	    SHOW(std::is_layout_compatible_v<Foo, Bar>);
	    SHOW(std::is_layout_compatible_v<Foo[2], Bar[2]>);
	    SHOW(std::is_layout_compatible_v<int, E0>);
	    SHOW(std::is_layout_compatible_v<E0, E1>);
	    SHOW(std::is_layout_compatible_v<long, unsigned long>);
	    SHOW(std::is_layout_compatible_v<char*, const char*>);
	    SHOW(std::is_layout_compatible_v<char*, char* const>);
	}

Output:
	std::is_layout_compatible_v<const void,	volatile void> = true
	std::is_layout_compatible_v<Foo, Bar>		       = true
	std::is_layout_compatible_v<Foo[2], Bar[2]>	       = false
	std::is_layout_compatible_v<int, E0>		       = false
	std::is_layout_compatible_v<E0,	E1>		       = true
	std::is_layout_compatible_v<long, unsigned long>       = false
	std::is_layout_compatible_v<char*, const char*>	       = false
	std::is_layout_compatible_v<char*, char* const>	       = true

See also
	  is_standard_layout checks if a type is a standard-layout type
	  (C++11)	     (class template)

http://cppreference.com		  2022.07.31	  std::is_layout_compatible(3)

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

home | help