std::is_layout_compatible
來自 cppreference.com
定義於標頭檔案 <type_traits> |
||
template< class T, class U > struct is_layout_compatible; |
(C++20 起) | |
如果 T
和 U
是佈局相容型別,則提供成員常量 value 等於 true。否則 value 為 false。
每種型別都與其任何 cv 限定版本佈局相容,即使它不是物件型別。
如果 T
或 U
不是完整型別、(可能帶 cv 限定的)void,或未知邊界的陣列,則行為未定義。
如果上述模板的例項化直接或間接依賴於不完整型別,並且該例項化在該型別假設完成時可能產生不同的結果,則行為未定義。
如果程式為 std::is_layout_compatible
或 std::is_layout_compatible_v
新增特化,則行為是未定義的。
目錄 |
[編輯] 輔助變數模板
template< class T, class U > constexpr bool is_layout_compatible_v = is_layout_compatible<T, U>::value; |
(C++20 起) | |
繼承自 std::integral_constant
成員常量
值 [靜態] |
如果 T 和 U 佈局相容,則為 true,否則為 false(public static 成員常量) |
成員函式
operator bool |
將物件轉換為 bool,返回 value (公開成員函式) |
operator() (C++14) |
返回 value (公開成員函式) |
成員型別
型別 | 定義 |
value_type
|
bool |
型別
|
std::integral_constant<bool, value> |
[編輯] 注意
有符號整數型別及其無符號對應型別不佈局相容。char 與 signed char 和 unsigned char 均不佈局相容。
類似型別在忽略頂層 cv 限定符後如果不是相同型別,則不佈局相容。
列舉型別及其底層型別不佈局相容。
佈局相容但元素型別不同(忽略 cv 限定符)的陣列型別不佈局相容,即使它們長度相等。
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_is_layout_compatible |
201907L |
(C++20) | std::is_layout_compatible
|
[編輯] 示例
執行此程式碼
#include <iomanip> #include <iostream> #include <type_traits> struct Foo { int x; char y; }; struct FooNua { int x; [[no_unique_address]] char y; }; class Bar { const int u = 42; volatile char v = '*'; }; enum E0 : int {}; enum class E1 : int {}; static_assert ( std::is_layout_compatible_v<const void, volatile void> == true and std::is_layout_compatible_v<Foo, Bar> == true and std::is_layout_compatible_v<Foo[2], Bar[2]> == false and std::is_layout_compatible_v<int, E0> == false and std::is_layout_compatible_v<E0, E1> == true and std::is_layout_compatible_v<long, unsigned long> == false and std::is_layout_compatible_v<char*, const char*> == false and std::is_layout_compatible_v<char*, char* const> == true and std::is_layout_compatible_v<Foo, FooNua> == false // Note [1] ); // [1] MSVC erroneously fails this assert int main() {}
[編輯] 另請參見
(C++11) |
檢查型別是否為標準佈局型別 (類模板) |