C++ 概念: LiteralType

来自cppreference.com
< cpp‎ | concept
 
 
 

指明一个类型为字面类型。字面类型是constexpr变量所拥有的类型,且它们能通过constexpr函数构造、操作及自之返回。

注意,标准没有定义拥有此名称的具名要求或概念。这是语言核心定义的类型。将它包含于此只是为了一致性。

目录

[编辑] 要求

字面类型是是下列之一:

  • 可以有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);
}
 
// 要求编译时常量的输出函数,为测试用
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++ 标准。

报告 适用于 已发布的行为 正确行为
CWG 1951 C++11 (类类型)
C++14 (void)
cv资格的void及类类型是否字面类型仍不明确 它们是

[编辑] 参阅

(C++11)(C++17中过时)
检查类型是否为字面类型
(类模板) [编辑]