最終更新日時(UTC):
が更新

履歴 編集

class template
<type_traits>

std::is_implicit_lifetime(C++23)

namespace std {
  template <class T>
  struct is_implicit_lifetime;

  template <class T>
  inline constexpr bool is_implicit_lifetime_v = is_implicit_lifetime<T>::value;
}

概要

Tが暗黙的に構築されるかを調べる。

暗黙的な構築はC++20で取り入れられた仕様であり、次のいずれかに該当する型であれば暗黙的に構築される

  1. スカラ型
  2. 配列型
    • 要素型は問わない
  3. implicit-lifetime class types
    • デストラクタがユーザー定義されていない集成体型、もしくは
    • 少なくとも1つの資格のあるトリビアルコンストラクタと、トリビアルで削除されていないデストラクタを持つ型
  4. 1~3のCV修飾された型

要件

Tは配列型、完全型、またはvoidでなければならない。

効果

is_implicit_lifetimeは、型Tが暗黙的に構築されるのであればtrue_typeから派生し、そうでなければfalse_typeから派生する。

#include <type_traits>
#include <utility>

enum Enum {};
class Class {};
class NotTrivial {
public:
    ~NotTrivial() {}
};

int main() {
    int i_array[1];
    NotTrivial nt_array[1];

    static_assert(std::is_implicit_lifetime<int>());
    static_assert(std::is_implicit_lifetime<int*>());
    static_assert(std::is_implicit_lifetime<decltype(i_array)>());
    static_assert(std::is_implicit_lifetime<Enum>());
    static_assert(std::is_implicit_lifetime<Class>());
    static_assert(!std::is_implicit_lifetime<NotTrivial>());
    static_assert(std::is_implicit_lifetime<decltype(nt_array)>());
    static_assert(std::is_implicit_lifetime<std::pair<int, int>>());
    static_assert(!std::is_implicit_lifetime<std::pair<int, NotTrivial>>());
}

出力

バージョン

言語

  • C++23

処理系

参照