constexpr specifier (C++11起)

来自cppreference.com
< cpp‎ | language

 
 
C++语言
表达式
替代表示
字面量
布尔型 - 整型 - 浮点型
字符型 - 字符串 - nullptr (C++11)
用户定义 (C++11)
Utilities
属性 (C++11)
Types
typedef声明
类型别名声明 (C++11)
Casts
隐式类型转换 - 显示类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
静态成员函数
模板
杂项
 
  • constexpr - 指定的变量或函数的值可以在编译时计算
    原文:
    constexpr - specifies that the value of a variable or function can be computed at compile time
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 解释

constexpr说明声明,它是可能的,以评估值的函数或变量在编译的时候,他们可以只编译常量表达式允许的时间。 constexpr意味着const.
原文:
constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time, they then can be used where only compile time 常量表达式 are allowed. constexpr implies const.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
“”constexpr变量必须满足以下要求:1
原文:
constexpr variables must satisfy the following requirements:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 必须立即建造或分配一个值.
    原文:
    it must be immediately constructed or assigned a value.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 构造函数的参数或值将被分配的值必须只包含文字,constexpr变量和函数.
    原文:
    the constructor parameters or the value to be assigned must contain only literal values, constexpr variables and functions.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 使用构造函数来构造对象(隐式或显式)的constexpr构造必须满足的要求。在显式构造函数的情况下,它必须constexpr指定.
    原文:
    the constructor used to construct the object (either implicit or explicit) must satisfy the requirements of constexpr constructor. In the case of explicit constructor, it must have constexpr specified.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
constexpr功能“'必须满足以下要求:1
原文:
constexpr functions must satisfy the following requirements:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 它不能是虚拟的
    原文:
    it must not be virtual
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 它的返回类型必须是LiteralType
    原文:
    its return type must be LiteralType
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 每个参数都必须是文本类型
    原文:
    each of its parameters must be literal type
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 函数体必须予以删除或拖欠或只包含以下
    原文:
    the function body must be either deleted or defaulted or contain only the following:
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 空语句
    原文:
    null statements
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • static_assert声明
    原文:
    static_assert declarations
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • typedef声明和别名声明没有定义的类或枚举
    原文:
    typedef declarations and 别名 declarations that do not define classes or enumerations
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 使用声明
    原文:
    using declarations
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • using指令
    原文:
    using directives
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 一个return只包含文字值,constexpr变量和函数的声明,..
    原文:
    exactly one return statement that contains only literal values, constexpr variables and functions.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
constexpr构造函数必须满足下列要求:
原文:
constexpr constructor must satisfy the following requirements:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 每个参数都必须是文本类型
    原文:
    each of its parameters must be literal type
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 类必须有虚基类
    原文:
    the class must have no virtual base classes
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 构造函数体必须删除或拖欠或只包含以下
    原文:
    the constructor body must be either deleted or defaulted or contain only the following:
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 空语句
    原文:
    null statements
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • static_assert声明
    原文:
    static_assert declarations
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • typedef声明和别名声明没有定义的类或枚举
    原文:
    typedef declarations and 别名 declarations that do not define classes or enumerations
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 使用声明
    原文:
    using declarations
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • using指令
    原文:
    using directives
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 构造函数不能有函数的try块
    原文:
    the constructor must not have a function-try block
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 每一个基类,每一个非静态成员必须初始化,无论是在initializer_list或大括号或等于初始值设定项。结束每个构造函数必须是一个constexpr构造函数和每一个括号或等于初始值设定项的每个条款都必须是一个常量表达式
    原文:
    every base class and every non-static member must be initialized, either in the initializer_list or by brace-or-equal initializer. End every constructor involved must be a constexpr constructor and every clause of every brace-or-equal initializer must be a constant expression
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 每一个隐式转换,必须是一个常量表达式
    原文:
    every implicit conversion involved must be a constant expression
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 关键字

constexpr

[编辑] 示例

定义的计算阶乘和文字类型的扩展字符串文字的constexpr功能

原文:

Definition of a constexpr function which computes factorials and a literal type that extends string literals

这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

#include <iostream>
#include <stdexcept>
 
// constexpr functions use recursion rather than iteration
constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n-1));
}
 
// literal class
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 functions signal errors by throwing exceptions from operator ?:
    constexpr char operator[](std::size_t n) {
        return n < sz ? p[n] : throw std::out_of_range("");
    }
    constexpr std::size_t size() { 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 << "4! = " ;
    constN<factorial(4)> out1; // computed at compile time
 
    volatile int k = 8;
    std::cout << k << "! = " << factorial(k) << '\n'; // computed at run time
 
    std::cout << "Number of lowercase letters in \"Hello, world!\" is ";
    constN<countlower("Hello, world!")> out2; // implicitly converted to conststr
}

输出:

4! = 24
8! = 40320
Number of lowercase letters in "Hello, world!" is 9