namespace std::meta {
consteval bool is_defaulted(info r);
}
概要
デフォルト関数(規格上のdefaulted function)であるかを判定する。
デフォルト関数には、以下が含まれる:
= defaultを明示的に付加して定義された関数- 暗黙的に宣言される特殊メンバ関数(デフォルトコンストラクタ、コピー/ムーブコンストラクタ、コピー/ムーブ代入演算子、デストラクタ)
- 暗黙的に宣言される比較演算子
戻り値
rがデフォルト関数を表す場合にtrueを返す。
例
#include <meta>
// すべての特殊メンバ関数が暗黙的に宣言される
struct Implicit {};
// 明示的に= defaultされる
struct Explicit {
Explicit() = default;
Explicit(int) {}
};
int main() {
template for (constexpr auto m :
std::define_static_array(std::meta::members_of(^^Implicit,
std::meta::access_context::unchecked()))) {
// Implicitクラスの暗黙宣言されたデフォルトコンストラクタ等もデフォルト関数となる
if constexpr (std::meta::is_default_constructor(m)) {
static_assert(std::meta::is_defaulted(m));
}
}
template for (constexpr auto m :
std::define_static_array(std::meta::members_of(^^Explicit,
std::meta::access_context::unchecked()))) {
if constexpr (std::meta::is_default_constructor(m)) {
// 明示的な= default指定された関数もデフォルト関数
static_assert(std::meta::is_defaulted(m));
}
if constexpr (std::meta::is_constructor(m)
&& !std::meta::is_default_constructor(m)
&& !std::meta::is_copy_constructor(m)
&& !std::meta::is_move_constructor(m)) {
// ユーザー定義コンストラクタはデフォルト関数ではない
static_assert(!std::meta::is_defaulted(m));
}
}
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) ✅ - Visual C++: ??