Вопросы с тегом «constexpr»

constexpr - это модификатор, введенный в C ++ 11, который сообщает компилятору, что значение функции или переменной известно или может быть вычислено во время компиляции. Таким образом, его можно использовать как константу там, где иначе и быть не могло.

337
Когда следует использовать возможность constexpr в C ++ 11?

Мне кажется, что наличие «функции, которая всегда возвращает 5» нарушает или ослабляет значение «вызова функции». Должна быть причина, или необходимость в этой возможности, иначе ее не будет в C ++ 11. Почему это там? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife...

193
Имеет ли смысл статическая переменная constexpr внутри функции?

Если у меня есть переменная внутри функции (скажем, большой массив), имеет ли смысл объявлять ее одновременно staticи constexpr? constexprгарантирует, что массив создается во время компиляции, так что staticбудет бесполезно? void f() { static constexpr int x [] = { // a few thousand elements }; //...

186
Неопределенная ссылка на статический constexpr char []

Я хочу иметь static const charмассив в моем классе. GCC пожаловался и сказал мне, что я должен использовать constexpr, хотя теперь он говорит мне, что это неопределенная ссылка. Если я сделаю массив не членом, он будет скомпилирован. Что происходит? // .hpp struct foo { void bar(); static constexpr...

175
Можно ли использовать std :: string в constexpr?

Использование C ++ 11, Ubuntu 14.04, GCC по умолчанию . Этот код не работает: constexpr std::string constString = "constString"; ошибка: тип 'const string {aka const std :: basic_string}' переменной constexpr 'constString' не является литералом ... потому что ... 'std :: basic_string' имеет...

96
Что значит «отравить функцию» в C ++?

В самом конце выступления Скотта Шурра «Представляем constexpr» на CppCon он спрашивает: «Есть ли способ отравить функцию»? Затем он объясняет, что это можно сделать (хотя и нестандартным способом): Ввод throwв constexprфункцию Объявление неразрешенной extern const char* Ссылаясь на нерешенные...

94
Вычисление длины строки C во время компиляции. Это действительно constexpr?

Я пытаюсь вычислить длину строкового литерала во время компиляции. Для этого я использую следующий код: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } Все работает как...

45
Как я могу получить глубину многомерного std :: vector во время компиляции?

У меня есть функция, которая принимает многомерный std::vectorи требует, чтобы глубина (или количество измерений) передавалась как параметр шаблона. Вместо жесткого кодирования этого значения я хотел бы написать constexprфункцию, которая будет принимать std::vectorи возвращать глубину как unsigned...

28
Счетчики времени компиляции C ++, вновь

TL; DR Прежде чем пытаться прочитать весь этот пост, знайте, что: решение поставленной проблемы было найдено мной , но я все еще хочу знать, является ли анализ правильным; Я упаковал решение в fameta::counterкласс, который решает несколько оставшихся уловок. Вы можете найти это на github ; Вы...

17
Любые ошибки заменить глобальный const char [] на constexpr string_view?

Наша команда работает с базой кода C ++ более 10 лет и недавно перешла на компилятор C ++ 17. Поэтому мы ищем способы модернизировать наш код. В ходе конференции на YouTube я услышал предложение заменить const char*глобальные строки на constexpr string_view. Поскольку const char*в нашем коде есть...

16
std :: pair <auto, auto> тип возвращаемого значения

Я играл с autoв std::pair. В приведенном ниже коде функция fдолжна возвращать std::pairтипы, которые зависят от параметра шаблона. Рабочий пример: Пример 1 template <unsigned S> auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return...

14
Является ли разница между двумя экземплярами constexpr указателей __func__ все еще constexpr?

Это действительный C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC и MSVC считают, что все в порядке, Clang считает, что это не так: Compiler Explorer . Все компиляторы соглашаются, что с этим все в порядке: Compiler Explorer . int main() { constexpr auto p = __func__;...

14
Почему std :: swap не помечен как constexpr до C ++ 20?

В C ++ 20 std::swapстановится constexprфункцией. Я знаю, что стандартная библиотека действительно отстала от языка в маркировке вещей constexpr, но к 2017 году <algorithm>была в значительной степени консекстом, как и куча других вещей. Пока - std::swapнет. Я смутно помню, что был какой-то...

13
Как можно быстро вычислить const expr

Я пробовал константные выражения, которые оцениваются во время компиляции. Но я играл с примером, который кажется невероятно быстрым при исполнении во время компиляции. #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main () { long int res...

11
Законно ли инициализировать массив в конструкторе constexpr?

Является ли следующий код законным? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clang принимает это, но GCC и MSVC отклоняют это. Ошибка GCC: main.cpp:15:18: error: 'constexpr...

11
Может ли span быть constexpr?

Все конструкторы std :: span объявлены constexpr, однако я не могу заставить их работать в контексте constexpr. Раскомментирование любого из constexpr ниже приведет к ошибке компиляции. #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr...