Описание тега if-constexpr

Функция C++17, в которой условие оператора if оценивается во время компиляции. Результат будет влиять на то, какая ветвь будет использоваться. Другой ветке нужен только правильный синтаксис.
2 ответа

Как использовать понятия в if-constexpr?

Как использовать понятия в if constexpr? Учитывая приведенный ниже пример, что бы дать if constexpr вернуть 1 в случае T отвечает требованиям integral а еще 0? template<typename T> concept integral = std::is_integral_v<T>; struct X{}; te…
07 фев '19 в 12:32
1 ответ

Взаимодействие "if constexpr" с предупреждением "try in constexpr function"

Я утверждаю, что эта программа должна быть правильно сформирована: она объявляет функцию-член constexpr S<int>, Однако и GCC, и Clang отклоняют эту программу. template<class T> struct S { constexpr int foo() { if constexpr (std::is_same_…
2 ответа

Если constexpr() выдает ошибку в C++17

Я читал о constexpr в C++17, используя эту ссылку ссылки. Затем я сделал C++ программу для тестирования constexpr: #include <iostream> int i = 10; int func() { if constexpr (i == 0) return 0; else if (i > 0) return i; else return -1; } int …
12 сен '17 в 11:05
0 ответов

Static_assert внутри, если constexpr не сбрасывается

Следующие static_assert следует отбросить, находясь в ложной ветви if constexpr, однако компиляция не удалась из-за ошибки подтверждения: #include <type_traits> template <class T> constexpr bool f() { if constexpr (std::is_same<T, int…
3 ответа

constexpr в for-заявлении

C++17 обеспечивает if constexpr, в котором: значение условия должно быть контекстно-преобразованным константным выражением типа bool, Если значение true, тогда оператор-ложь отбрасывается (если присутствует), в противном случае оператор-истина отбр…
3 ответа

Если есть if-constexpr, почему не существует switch-constexpr?

В C++17 if constexpr был представлен; тем не менее, кажется, нет switch constexpr (см. здесь). Это почему? То есть, если компилятор поддерживает if constexpr Разве это не тривиально, чтобы поддержать switch constexpr (в худшем случае в виде цепочки …
19 ноя '18 в 16:42
3 ответа

Эквивалентный троичный оператор для constexpr if?

Может быть, я что-то пропустил, но не могу найти подсказки: есть ли в C++ 17 троичный оператор constexpr, эквивалентный constexpr-if? template<typename Mode> class BusAddress { public: explicit constexpr BusAddress(Address device) : mAddress(M…
07 дек '16 в 07:44
2 ответа

Использование constexpr-if в общей лямбде для определения типа параметра

У меня следующая проблема: у меня есть иерархия классов с базовым классом и двумя подклассами. Я реализовал resolve_type функция, которая принимает экземпляр базового класса и универсальную лямбду (или аналогичную). Функция разрешает свой тип и пере…
22 июл '17 в 19:33
4 ответа

Почему эта "неопределенная внешняя переменная" не приводит к ошибке компоновщика в C++17?

Я скомпилировал и запустил следующую программу в компиляторе C++17 (Coliru). В программе я объявил extern переменная, но не определила это. Однако компилятор не выдает ошибку компоновщика. #include <iostream> extern int i; // Only declaration …
11 июл '17 в 07:21
2 ответа

Сравнение параметра функции constexpr в условии constexpr-if вызывает ошибку

Я пытаюсь сравнить параметр функции внутри оператора constexpr-if. Вот простой пример: constexpr bool test_int(const int i) { if constexpr(i == 5) { return true; } else { return false; } } Однако, когда я компилирую это с GCC 7 со следующими флагами…
28 июл '17 в 15:26
2 ответа

Альтернативы многим вложенным std::conditional_t?

Я нахожу много вложенных std::conditional_t ​​трудными для чтения, поэтому я выбираю другой шаблон (вызова decltype для функции с автоматическим типом возврата): template<bool is_signed, std::size_t has_sizeof> auto find_int_type(){ static_ass…
30 авг '18 в 07:42
1 ответ

Ошибка MSVS2017 "выражение не оценивается как константа" при компиляции constexpr с помощью лямбды

Я использую MSVS C++17 и приведенный ниже код не может быть скомпилирован: #include <type_traits> #include <tuple> using namespace std; template <size_t Size, class Pred, size_t idx=0, size_t... pass> constexpr auto makeIndices(con…
10 июн '18 в 17:06
2 ответа

std::is_constant_evaluated поведение

GCC9 уже реализует std::is_constant_evaluated, Я немного поиграл с этим, и понял, что это несколько сложно. Вот мой тест: constexpr int Fn1() { if constexpr (std::is_constant_evaluated()) return 0; else return 1; } constexpr int Fn2() { if (std::is_…
18 янв '19 в 09:59
2 ответа

`if constexpr` против`if` в свете оптимизации компилятора и производительности кода

Рассмотрим шаблон функции func это очень важно для производительности. Это может быть реализовано с T=Type1 или какой-то другой тип. Часть функциональной логики зависит от T оно создается с помощью. Можно либо явно использовать if constexpr (Код B) …
06 фев '19 в 01:44
1 ответ

"If constexpr" полезен вне шаблонов?

Я пытаюсь понять if constexpr от корки до корки. Я понимаю, что если if constexpr(expr) используется в шаблоне, и expr зависит от параметра шаблона, то во время реализации только один из then/else ветви будут созданы, остальные будут отброшены. У ме…
1 ответ

Остановка компиляции Visual Studio 17, когда я нажму плохой constexpr, если ветка

Есть ли способ заставить компилятор потерпеть неудачу, если constexpr, если ветвь не должна ударить? этот код ниже объясняет все это лучше, чем я мог: template<unsigned int number_base> class arithmetic_type { if constexpr(number_base == 0 || …
1 ответ

Оператор Constexpr новый

Можно ли перегрузить оператор, чтобы быть новой функцией constexpr? Что-то вроде: constexpr void * operator new( std::size_t count ); Причиной является выполнение функции constexpr в перегруженном теле оператора, где значение аргумента count будет в…
21 ноя '18 в 19:18
3 ответа

Если constexpr и C4702 (и C4100, и C4715)

Есть ли способ исправить следующую проблему: Этот код выдает предупреждение C4702 "недоступный код" (на VC++ 15.8 с /std:c++17) template <typename T, typename VariantType> inline bool MatchMonostate( VariantType& variant ) { SUPPRESS_C4100…
09 сен '18 в 12:41
5 ответов

"Если constexpr" в C++17 не работает в не шаблонной функции

Я пытался играть со стандартом C++17. Я пытался использовать одну из функций C++17 if constexpr, И у меня возникла проблема... Пожалуйста, посмотрите на следующий код. Это компилируется без ошибок. В следующем коде я пытался использовать if constexp…
26 апр '18 в 20:38
2 ответа

Почему рекурсивное значение шаблона constexpr не компилируется?

Я определяю способ узнать положение типа в списке типов, используя рекурсивные шаблоны в C++17. Я попробовал два способа: один с использованием значения constexpr и один с использованием функции constexpr. Второе, используя if оператор, компилируетс…
23 июн '18 в 20:10