Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Ключевое слово constexpr: как определить удалось ли вычислить возвращаемое значение на этапе компиляции?

09.01.2017, 16:01. Показов 4025. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
https://habrahabr.ru/post/228181/
Ключевое слово constexpr, добавленное в C++11, перед функцией означает, что если значения параметров возможно посчитать на этапе компиляции, то возвращаемое значение также должно посчитаться на этапе компиляции. Если значение хотя бы одного параметра будет неизвестно на этапе компиляции, то функция будет запущена в runtime (а не будет выведена ошибка компиляции).
Как определить удалось ли вычислить возвращаемое значение на этапе компиляции?
Я понимаю что можно анализировать код и делать вывод "вот этот кусок может быть вычислен на этапе компиляции"
А есть ли способ при компиляции узнать чего случилось на этапе компиляции а что ушло в рантайм (не проверяя самому на глаз и не делая догадки)?
И без чтения машинного кода)) Нужен простой способ определить это
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.01.2017, 16:01
Ответы с готовыми решениями:

Как на этапе компиляции определить принадлежность к классу?
Есть шаблонный класс, который в зависимости от переданного класса в параметре подбирает нужный контейнер-обёртку. ...

Как добавить анонимный тип в объект не на этапе компиляции, а на этапе выполнения программы? Надо для routes.MapRoute
В приложении ASP.NET MVC у меня есть xml файл с маршрутами типа: <route url="Home/{par1}/{par2}" controller="Home"...

Не удалось изменить возвращаемое значение для List<T>.this[int]
listStructSelected.byteStatus = getStatus(); Ошибка: Ошибка 25 Не удалось изменить возвращаемое значение для...

13
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.01.2017, 16:06
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Присвоить результат выполнения constexpr переменной. Если выдаст ошибку компиляции - нельзя.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2017, 16:29  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Присвоить результат выполнения constexpr переменной. Если выдаст ошибку компиляции - нельзя.
Понял спасибо!

Добавлено через 51 секунду
А есть способ что бы не мучиться и не проверять каждый раз вручную? Это надоест если кода много
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.01.2017, 16:34
Цитата Сообщение от sys_beginner Посмотреть сообщение
А есть способ что бы не мучиться и не проверять каждый раз вручную? Это надоест если кода много
Изначально при написании функции можно прикинуть варианты её использования и понять, есть ли вариант её работы на этапе компиляции. Да и с не constexpr объектами она не разрешит работать.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2017, 16:37  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Изначально при написании функции можно прикинуть варианты её использования и понять, есть ли вариант её работы на этапе компиляции.
Этого и хотелось избежать)) Ок, понял
Спасибо ещё раз

Добавлено через 47 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
Да и с не constexpr объектами она не разрешит работать.
Хоть какое то утешение
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
14.01.2017, 17:56
Цитата Сообщение от sys_beginner Посмотреть сообщение
Как определить удалось ли вычислить возвращаемое значение на этапе компиляции?
Немного тут покумекал, получилась такая фиговина:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
 
#define CAN_BE_COMPILE_TIME_EVALUATE(FUNC, ...) \
[&]() {\
    auto foo________ = [&]() noexcept(false) {\
        return FUNC(__VA_ARGS__);\
    };\
    return noexcept(foo________()); \
}()
 
 
 
constexpr int foo(int x)
{
   int sum = 0;
   for (int i = 0; i < 10; ++i) {
      sum += i;
   }
   return sum;
}
 
 
 
int main()
{
    const int x1 = 20;
    int x2 = 10;
    constexpr bool b1 = CAN_BE_COMPILE_TIME_EVALUATE(foo, x1);
    constexpr bool b2 = CAN_BE_COMPILE_TIME_EVALUATE(foo, x2);
    std::cout << b1 << std::endl;
    std::cout << b2 << std::endl;
    constexpr int f = foo(x1);
    //constexpr int f = foo(x2);//error
}
в отличии от способа с инициализацией constexpr,
не вызывает ошибку компиляции,
хотя и вычисляется на этапе компиляции.
Может и не везде будет работать, не знаю.

P.S. Тревога! В коде TAB'ы.
P.P.S. А еще в коде вариативные макросы gcc и возможности C++17
7
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
14.01.2017, 18:10
 Комментарий модератора 
sys_beginner, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 4.3 (порядок именования тем).

.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.01.2017, 20:04  [ТС]
Croessmah,
Спасибо, только не пойму что происходит в коде.
У вас создается анонимная функция с захватом ссылки без имени, как это работает? Как обратиться к такому параметру без имени и зачем он там нужен?

Внутри функции у вас создается ещё одна функция, которая принимает тестируюмую функцию как аргумент и передает туда вариативные параметры. Но потом возвращается return noexcept(foo________()); - не понял что именно тут происходит, noexcept вроде пишется в описании функции а не при возврате значения
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
14.01.2017, 21:34
Цитата Сообщение от sys_beginner Посмотреть сообщение
как это работает?
Захватывает все переменные по ссылке в данном скоупе.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.01.2017, 22:19  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
Захватывает все переменные по ссылке в данном скоупе.
Спасибо, действительно захватывает. Но похоже все таки не по ссылке

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <map>
#include <functional>
 
int main() {
    int n = 1000;
    std::function<void(void)> f = [&]()
    {
        n = 2000;
    };
    std::cout << n;//1000
}
http://rextester.com/GLZ22737
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
14.01.2017, 22:22
Цитата Сообщение от sys_beginner Посмотреть сообщение
не по ссылке
а вызывать кто будет?
C++
1
f();
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.01.2017, 22:29  [ТС]
GbaLog-,
Я очень сильно тупанул ))

Croessmah,
Точно, спасибо!

Добавлено через 1 минуту
Ещё и map почему то добавил в хедера)))
Пойду отдохну что ли
0
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
15.01.2017, 15:56
Почему-то проблемы подобная проверка не вызывала. Если я делал функцию constexpr, то делал и static_assert для проверки возвращаемого значения. По-моему, это гораздо проще, чем создание переменных или макросов.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
15.01.2017, 17:32
Цитата Сообщение от Lyosha12 Посмотреть сообщение
По-моему, это гораздо проще, чем создание переменных или макросов.
Разница в том, что можно вычислить в compile-time,
может ли значение функции быть вычислено в commile-time.
Для static_assert или инициализацию constexpr упремся в ошибку,
а так может и можно что-то намудрить будет (понятия не имею что).
Т.к. конечное значение constexpr, то можно его задействовать как-то,
например, в constexpr if:

C++
1
2
3
4
5
if constexpr (b1) {
   //...
} else {
   //...
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2017, 17:32
Помогаю со студенческими работами здесь

Определить, в введенном предложении слово, которое состоит из тех же букв, что и заданное ключевое слово.
Ввести предложения и ключевое слово. Определить, в введенном предложении слово, которое состоит из тех же букв, что и заданное ключевое...

Как определить возвращаемое значение для пользовательского элемента управления?
Создаю пользовательский элемент управления. На поле UserControl1 перетаскиваю элемент TextBox, для которого задается возможность вводить...

Структура в List<>, "Не удалось изменить возвращаемое значение"
Всем привет. namespace { struct STRUCT { internal float a; internal float b; ...

Не удалось изменить возвращаемое значение "Transform.position", т.к. оно не является переменной
Не удалось изменить возвращаемое значение &quot;Transform.position&quot;, т.к. оно не является переменной. Ошибка на 13 строке. Просьба помочь! ...

Как на этапе компиляции создать необходимое количество шаблонных функций?
Есть алгоритм, который использует функцию от одного аргумента. Этот же алгоритм должен использовать функцию, которая задаётся тем же одним...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru