C++ concepts: LiteralType - cppreference.com

##### cppreference.com

##### Search

Create account

##### Namespaces

- Page
- Discussion

##### Variants

##### Views

- View
- Edit
- History

##### Actions

# C++ concepts: LiteralType

From cppreference.com
< cpp‎ | concept

Specifies that a type is a literal type. Literal types can be constructed, manipulated, and returned from constexpr functions.

Note, that the standard doesn't define a named requirement or concept with this name. This is a type category defined by the core language. It is included here as concept only for consistency.

### [edit] Requirements

A literal type is any of the following

- void(since c++14)
- scalar type
- reference type
- an array of literal type
- class type that has all of the following properties:

  - has a trivial destructor,
  - is either
    - an aggregate type
    - a type with at least one constexpr (possibly template) constructor that is not a copy or move constructor
  - all non-static data members and base classes are of non-volatile literal types.

### [edit] Example

literal type that extends string literals:

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 << "Number of lowercase letters in \"Hello, world!\" is ";
        constN<countlower("Hello, world!")>(); // implicitly converted to conststr
    }

Output:

    Number of lowercase letters in "Hello, world!" is 9

### [edit] See also

is_literal_type (C++11) | checks if a type is literal type (class template) [edit]

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/concept/LiteralType&oldid=71815"