名前付き要件: LiteralType
提供: cppreference.com
型がリテラル型であることを指定します。 リテラル型は constexpr 変数の型であり、構築したり、操作したり、 constexpr 関数から返すことができます。
ノート: 標準はこの名前を持つ名前付き要件を定義していません。 これはコア言語によって定義される型カテゴリです。 これは一貫性のためだけに名前付き要件としてここに含まれています。
要件
リテラル型は以下のいずれかです。
|
(C++14以上) |
- スカラー型
- 参照型
- リテラル型の配列
- 以下の性質をすべて持つクラス型または cv 修飾されたクラス型
- トリビアルなデストラクタを持つ
- 以下のいずれか
- 集成体型
- コピーコンストラクタでもムーブコンストラクタでもない constexpr コンストラクタ (テンプレートでも構いません) を少なくともひとつ持つ型
| (C++17以上) |
|
(C++17以上) |
|
(C++17未満) |
例
文字列リテラルを拡張するリテラル型。
Run this code
#include <iostream>
#include <stdexcept>
class conststr
{
const char* p;
std::size_t sz;
public:
template<std::size_t N>
constexpr conststr(const char(&a)[N]) : p(a), sz(N - 1) {}
constexpr char operator[](std::size_t n) const
{
return n < sz ? p[n] : throw std::out_of_range("");
}
constexpr std::size_t size() const { return sz; }
};
constexpr std::size_t countlower(conststr s, std::size_t n = 0,
std::size_t c = 0)
{
return n == s.size() ? c :
s[n] >= 'a' && s[n] <= 'z' ? countlower(s, n + 1, c + 1) :
countlower(s, n + 1, c);
}
// output function that requires a compile-time constant, for testing
template<int n>
struct constN
{
constN() { std::cout << n << '\n'; }
};
int main()
{
std::cout << "the number of lowercase letters in \"Hello, world!\" is ";
constN<countlower("Hello, world!")>(); // implicitly converted to conststr
}
出力:
the number of lowercase letters in "Hello, world!" is 9
欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
| DR | 適用先 | 発行時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 1951 | C++11 (class type) C++14 (void) |
unclear if cv-qualified void and class types are literal types
|
they are |
関連項目
(C++11)(C++17で非推奨)(C++20で削除) |
型がリテラル型かどうか調べます (クラステンプレート) |