std::is_layout_compatible
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <type_traits> で定義
|
||
template< class T, class U > struct is_layout_compatible; |
(C++20以上) | |
T と U がレイアウト互換型であれば、 true に等しいメンバ定数 value が提供されます。 そうでなければ、 value は false です。
すべての型は、オブジェクト型でなくとも、その cv 修飾されたバージョンとレイアウト互換です。
T および U はいずれも完全型 (またはその cv 修飾された型)、 void、またはサイズの未知な配列でなければなりません。 そうでなければ、動作は未定義です。
上記のテンプレートの実体化が直接または間接的に不完全型に依存しており、もしその型が仮に完全型であったならばその実体化が異なる結果を産むであろう場合は、動作は未定義です。
ヘルパー変数テンプレート
<tbody> </tbody> template< class T, class U > inline constexpr bool is_layout_compatible_v = is_layout_compatible<T, U>::value; |
(C++20以上) | |
std::integral_constant から継承
メンバ定数
value [静的] |
T と U がレイアウト互換であるならば true、そうでなければ false (パブリック静的メンバ定数) |
メンバ関数
operator bool |
オブジェクトを bool に変換します。 value を返します (パブリックメンバ関数) |
operator() (C++14) |
value を返します (パブリックメンバ関数) |
メンバ型
| 型 | 定義 |
value_type
|
bool
|
type
|
std::integral_constant<bool, value>
|
ノート
符号付き整数型とその符号なし版はレイアウト互換ではありません。 char は signed char とも unsigned char ともレイアウト互換ではありません。
相似型は、トップレベルの cv 修飾を無視したときに同じ型でなければ、レイアウト互換ではありません。
列挙型とそのベースとなる型はレイアウト互換ではありません。
レイアウト互換だけれども異なる要素型 (cv 修飾は無視します) の配列型は、長さが同じでも、レイアウト互換ではありません。
例
Run this code
#include <type_traits>
#include <iostream>
struct Foo {
int x;
char y;
};
class Bar {
const int u = 42;
volatile char v = '*';
};
enum E0 : int {};
enum class E1 : int {};
int main()
{
std::cout << std::boolalpha
<< std::is_layout_compatible_v<const void, volatile void> << '\n'
<< std::is_layout_compatible_v<Foo, Bar> << '\n'
<< std::is_layout_compatible_v<Foo[2], Bar[2]> << '\n'
<< std::is_layout_compatible_v<int, E0> << '\n'
<< std::is_layout_compatible_v<E0, E1> << '\n'
<< std::is_layout_compatible_v<long, unsigned long> << '\n'
<< std::is_layout_compatible_v<char*, const char*> << '\n'
<< std::is_layout_compatible_v<char*, char* const> << '\n';
}
出力:
true
true
false
false
true
false
false
true
関連項目
(C++11) |
型が標準レイアウト型かどうか調べます (クラステンプレート) |