最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::is_literal_type(C++11)

namespace std {
  template <class T>
  struct is_literal_type;
}

概要

Tがリテラル型か調べる。

要件

remove_all_extents<T>::typeは、完全型か、const/volatile修飾された(あるいはされていない)voidでなければならない。

効果

is_literal_typeは、型Tがリテラル型であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

リテラル型とは、以下のいずれかの条件を満たす型である:

  • スカラ型
  • リテラル型への参照
  • リテラル型の配列
  • 以下の全ての特性を持つクラス型
    • トリビアルなデストラクタを持つ
    • 全てのコンストラクタが、定数式で初期化できること
    • 集成体であること、もしくは一つ以上のconstexprコンストラクタ、もしくはコピー/ムーブコンストラクタ以外のコンストラクタテンプレートを持っていること
    • 全てのデータメンバおよび基本クラスがリテラル型であること
  • void (C++14から)

リテラル型は、constexpr関数のパラメータおよび戻り値の型に対する制約として使用されている。

#include <type_traits>

struct X {
  int value;

  constexpr X(int value)
    : value(value) {}
};

static_assert(std::is_literal_type<int>::value, "int is literal type");
static_assert(std::is_literal_type<void>::value, "void is literal type");
static_assert(std::is_literal_type<X>::value, "X is literal type");

int main() {}

出力

バージョン

言語

  • C++11

処理系

  • Clang: 3.1
  • GCC, C++11 mode: 4.6.4
  • Visual C++: 11.0, 12.0, 14.0
    • 11.0~12.0は、C++11の定義に基づく実装となっている。すなわち、テンプレート実引数としてvoidを渡すとstd::false_typeからの派生になる。

備考

Clang 3.0では、上記サンプルにおけるX型が、リテラル型と見なされない。この問題は、Clang 3.1で修正されている。

参照

  • LWG Issue 2015. Incorrect pre-conditions for some type traits
    • C++11では要件が「型Tは完全型であるか、const/volatile修飾された(あるいはされていない)voidか、要素数不明の配列型でなければならない。」だったが、これは間違いであるため、C++14で「型remove_all_extents<T>::typeは、完全型か、const/volatile修飾された(あるいはされていない)voidでなければならない。」に変更された。