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:

#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

checks if a type is literal type
(class template)