C++ concepts: LiteralType
From cppreference.com
Specifies that a type is a literal type. Literal types are the types of constexpr variables and they 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:
|
(since C++14) |
- scalar type;
- reference type;
- an array of literal type;
- possibly cv-qualified (since C++17) 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 << "the number of lowercase letters in \"Hello, world!\" is "; constN<countlower("Hello, world!")>(); // implicitly converted to conststr }
Output:
the number of lowercase letters in "Hello, world!" is 9
[edit] See also
(C++11)
|
checks if a type is literal type (class template) |