Пространства имён
Варианты
Действия

constexpr specifier (начиная с C++11)

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
  • constexpr - указывает, что значение переменной или функции можно вычислить во время компиляции
    Оригинал:
    constexpr - specifies that the value of a variable or function can be computed at compile time
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Объяснение

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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
'constexpr переменных' должны удовлетворять следующим требованиям:
Оригинал:
constexpr variables must satisfy the following requirements:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • она должна быть немедленно построены или присвоенное значение.
    Оригинал:
    it must be immediately constructed or assigned a value.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Конструктор параметры или значение, которое присваивается должны содержать только буквенные значения, constexpr переменных и функций.
    Оригинал:
    the constructor parameters or the value to be assigned must contain only literal values, constexpr variables and functions.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Конструктор используется для создания объекта (либо явных или неявных) должны удовлетворять требованиям 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.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
'constexpr функции' должны удовлетворять следующим требованиям:
Оригинал:
constexpr functions must satisfy the following requirements:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • она не должна быть виртуальной
    Оригинал:
    it must not be virtual
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • возвращаемый тип должен быть LiteralType
    Оригинал:
    its return type must be LiteralType
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Каждый из его параметров должны быть буквальным типа
    Оригинал:
    each of its parameters must be literal type
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Тело функции должны быть либо удалены или дефолт или содержать только следующие:
    Оригинал:
    the function body must be either deleted or defaulted or contain only the following:
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • нулевой отчетности
    Оригинал:
    null statements
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • static_assert деклараций
    Оригинал:
    static_assert declarations
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • typedef заявлений и деклараций псевдонима, которые не определяют классы или перечисления
    Оригинал:
    typedef declarations and псевдонима declarations that do not define classes or enumerations
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • использование деклараций
    Оригинал:
    using declarations
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • с помощью директив
    Оригинал:
    using directives
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • ровно один return заявление, которое содержит только буквенные значения, constexpr переменных и функций.
    Оригинал:
    exactly one return statement that contains only literal values, constexpr variables and functions.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
'constexpr конструктор' должны удовлетворять следующим требованиям:
Оригинал:
constexpr constructor must satisfy the following requirements:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Каждый из его параметров должны быть буквальным типа
    Оригинал:
    each of its parameters must be literal type
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Класс должен иметь не виртуальные базовые классы
    Оригинал:
    the class must have no virtual base classes
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Конструктор тело должно быть либо исключить, либо дефолт, либо содержат лишь следующее:
    Оригинал:
    the constructor body must be either deleted or defaulted or contain only the following:
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • нулевой отчетности
    Оригинал:
    null statements
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • static_assert деклараций
    Оригинал:
    static_assert declarations
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • typedef заявлений и деклараций псевдонима, которые не определяют классы или перечисления
    Оригинал:
    typedef declarations and псевдонима declarations that do not define classes or enumerations
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • использование деклараций
    Оригинал:
    using declarations
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • с помощью директив
    Оригинал:
    using directives
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Конструктор не должен иметь функции-блока проверки
    Оригинал:
    the constructor must not have a function-try block
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • каждый базовый класс, и каждый не статические члены должны инициализироваться, либо в initializer_list или фигурную скобку или равно инициализатор. Конец каждого конструктора участие должно быть конструктором КонстВыраж и каждый пункт каждого скобки или равно инициализаторе должно быть постоянным выражением
    Оригинал:
    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.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • каждый неявного преобразования участие должно быть постоянным выражением
    Оригинал:
    every implicit conversion involved must be a constant expression
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Ключевые слова

constexpr

[править] Пример

Определение КонстВыраж функцию, которая вычисляет факториал и тип литерала, который расширяет строковые литералы

Оригинал:

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

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

#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