namespace std {
template <class T>
struct is_structural;
template <class T>
inline constexpr bool is_structural_v = is_structural<T>::value;
}
概要
型Tが構造的型 (structural type) であるかを判定する。
構造的型は、定数テンプレートパラメータとして使用できる型である。具体的には以下のいずれかである:
- スカラ型
- 左辺値参照型
- 直接基底クラスとメンバ変数がすべて
publicかつmutableでなく、それらの型がすべて構造的型(または構造的型の配列)であるリテラルクラス型 - キャプチャを持たないラムダ式のクロージャ型
なお、右辺値参照型は構造的型ではない。
要件
remove_all_extents_t<T>が完全型であるか、CV修飾されたvoidであること。
効果
is_structuralは、型Tが構造的型であればtrue_typeから派生し、そうでなければfalse_typeから派生する。
例
#include <type_traits>
struct Structural {
int x;
double y;
};
struct NotStructural {
private:
int x; // privateメンバがあるため構造的型ではない
};
int main() {
static_assert(std::is_structural_v<int>);
static_assert(std::is_structural_v<int&>);
static_assert(std::is_structural_v<Structural>);
static_assert(!std::is_structural_v<NotStructural>);
static_assert(!std::is_structural_v<int&&>); // 右辺値参照は構造的型ではない
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) ✅ - Visual C++: ??