名前空間
変種
操作

名前付き要件: LiteralType

提供: cppreference.com
< cpp‎ | named req
 
 
名前付き要件
基本
レイアウト
ライブラリ全体
コンテナ
コンテナの要素
イテレータ
ストリーム入出力
乱数
並行処理
(C++11)

(C++11)
(C++11)
その他
LiteralType
(C++11)
 

型がリテラル型であることを指定します。 リテラル型は constexpr 変数の型であり、構築したり、操作したり、 constexpr 関数から返すことができます。

ノート: 標準はこの名前を持つ名前付き要件を定義していません。 これはコア言語によって定義される型カテゴリです。 これは一貫性のためだけに名前付き要件としてここに含まれています。

目次

[編集] 要件

リテラル型は以下のいずれかです。

  • void または cv 修飾された void (そのため constexpr 関数は void を返せます)
(C++14以上)
  • スカラー型
  • 参照型
  • リテラル型の配列
  • 以下の性質をすべて持つクラス型または cv 修飾されたクラス型
  • トリビアルなデストラクタを持つ
  • 以下のいずれか
  • 集成体型
  • コピーコンストラクタでもムーブコンストラクタでもない constexpr コンストラクタ (テンプレートでも構いません) を少なくともひとつ持つ型
(C++17以上)
  • 共用体の場合、少なくともひとつの非静的データメンバが非 volatile なリテラル型である
  • 非共用体の場合、すべての非静的データメンバおよび基底クラスが非 volatile なリテラル型である
(C++17以上)
  • すべての非静的データメンバおよび基底クラスが非 volatile なリテラル型である
(C++17未満)

[編集]

文字列リテラルを拡張するリテラル型。

#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で削除)
型がリテラル型かどうか調べます
(クラステンプレート) [edit]