constexpr specifier (начиная с C++11)
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google.
Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке. Щёлкните здесь, чтобы увидеть английскую версию этой страницы |
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,constexprvariables and functions.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - Конструктор используется для создания объекта (либо явных или неявных) должны удовлетворять требованиям
constexprконструктор. В случае явного конструктора, это должно быть указано constexpr.Оригинал:the constructor used to construct the object (either implicit or explicit) must satisfy the requirements ofconstexprconstructor. 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 beLiteralTypeТекст был переведён автоматически используя Переводчик 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заявлений и деклараций псевдонима, которые не определяют классы или перечисленияОригинал:typedefdeclarations and псевдонима declarations that do not define classes or enumerationsТекст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - использование декларацийОригинал:using declarationsТекст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - с помощью директивОригинал:using directivesТекст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - ровно один
returnзаявление, которое содержит только буквенные значения,constexprпеременных и функций.Оригинал:exactly onereturnstatement that contains only literal values,constexprvariables 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заявлений и деклараций псевдонима, которые не определяют классы или перечисленияОригинал:typedefdeclarations 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 theinitializer_listor 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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
-
[править] Ключевые слова
[править] Пример
Определение КонстВыраж функцию, которая вычисляет факториал и тип литерала, который расширяет строковые литералы
Оригинал:
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

