Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615

C++14: вычисления на этапе компиляции

05.06.2018, 09:08. Показов 5666. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть такой код:
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
struct Qaz
{
    constexpr Qaz(uint8_t index) : _index(index) {}
 
private:
    uint8_t _index;
 
};
 
 
struct Qwerty
{
    constexpr Qwerty() = default;
 
    constexpr Qaz createQaz()
    {
        return Qaz(_globalId++);
    }
 
private:
    uint8_t _globalId = 0;
 
};
 
int main()
{
    constexpr Qwerty qwerty;
    constexpr Qaz qaz = qwerty.createQaz();
}
При компиляции на C++14 вылезают ошибки:
Code
1
2
3
4
In member function 'constexpr Qaz Qwerty::createQaz() const': 
21:26: error: increment of member 'Qwerty::_globalId' in read-only object 
22:5: error: expression '(((const Qwerty*)this)->Qwerty::_globalId++)' is not a constant-expression In function 'int main()':
31:42: error: 'constexpr Qaz Qwerty::createQaz() const' called in a constant expression
Ц++ версии 14 всё еще не умеет производить вычисления на этапе компиляции как D?
Хотелось бы реализовать шаблон "фабрика".
Или же тут как-то по-другому делать надо?

C++17 к сожалению не могу использовать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2018, 09:08
Ответы с готовыми решениями:

Ошибка на этапе компиляции
Добрый вечер. Ребят помогите, не могу понять в чем дело. Есть программа в которой описан 1 класс (работа с пользователями) Всё...

Ошибка на этапе компиляции
в чём может быть проблема?

Чтение файла на этапе компиляции
Можно ли считать файл настроек на этапе компиляции? Нужно что бы выбросить код который в рантайме не понадобится (в зависимости от...

4
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.06.2018, 11:25
Цитата Сообщение от [progeR] Посмотреть сообщение
Ц++ версии 14 всё еще не умеет производить вычисления на этапе компиляции как D?
умеет. однако, вы объявили константу времени компиляции,
а затем пытаетесь её модифицировать:
Цитата Сообщение от [progeR] Посмотреть сообщение
error: increment of member 'Qwerty::_globalId' in read-only object
считаете, это - нормально?


http://rextester.com/RUW4241



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
#include <cstdint>
 
struct Qaz
{
    constexpr Qaz(uint8_t index) : _index(index) {}
 
private:
    uint8_t _index;
 
};
 
 
struct Qwerty
{
    constexpr Qwerty() = default;
 
    constexpr Qaz createQaz() const noexcept
    {
        // --- все компалтайм высичления - костанты.
        // --- это значит, нельзя меня значение 
        // --- уже существующей константы
        return Qaz( static_cast<uint8_t>(_globalId + 1) );
    }
 
private:
    uint8_t _globalId = 0;  
};
 
int main()
{
    constexpr Qwerty qwerty;
    constexpr Qaz qaz = qwerty.createQaz();
    (void)qaz;
}

Не по теме:

справедливости ради, стоит заметить,
в крестах действительно есть возможность производить вычисления времени компиляции,
с использованием переменного состояния.
то бишь одна и так же функция, с одними и теми же входными параметрами,
времени компиляции может возвращать различные значения.

0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
05.06.2018, 21:48  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
считаете, это - нормально?
В D это нормально.

Ваш пример хорош, но член _globalId не изменяет значение, т.е. счетчик не работает. А мне нужно было именно, чтобы значение менялось, т.к. объектов Qaz может быть несколько.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.06.2018, 23:26
Цитата Сообщение от [progeR] Посмотреть сообщение
В D это нормально.
менять константу?
что за бред?
не специалист по Ди, но как то мне это сомнительно.


Цитата Сообщение от [progeR] Посмотреть сообщение
счетчик не работает.
счетчик времени компиляции:

http://rextester.com/YGYX44544

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
#include <iostream>
 
template<int N> struct flag
{
  friend constexpr int adl_flag(flag<N>);
};
 
template<int N> struct writer
{
  friend constexpr int adl_flag(flag<N>)  { return N; }
  static constexpr int value = N;
};
 
template<int N, int = adl_flag(flag<N>()),  int R = reader(N, flag<N + 1>())>
int constexpr reader(int, flag<N>)   { return R; }
 
template<int N>
int constexpr reader(float, flag<N>) { return N; }
 
template<int N = reader(0, flag<0>()), typename C = writer<N>>
constexpr int next() { return C::value; }
 
int main()
{
  
  constexpr int v1 = next();
  constexpr int v2 = next();
  constexpr int v3 = next();
  constexpr int v4 = next();
 
  std::cout << v1 << " " << v2 << " " << v3 << " " << v4 << std::endl;
}
обратите внимание:
комплатайм-вычисление функции next()
каждый раз возвращает значение на 1 больше.

достигается это не за счет модификации значения константы
(это какой то бред. какая же она тогда константа, если изменяемая?),
а за счет инстанцирования нового шаблона,
с константным значением на 1 больше.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
05.06.2018, 23:31
[progeR],
Так это же константа, поэтому при использовании инкремента возникают проблемы.
Ок, допустим компилятор может это дело разрулить, посчитать значение на этапе компиляциин и сформировать нужные вам значения, но что дальше?
В С++ constexpr функции так же могут быть вызваны в рантайме, и как, по вашему, должен работать такой код во время выполнения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2018, 23:31
Помогаю со студенческими работами здесь

Несистематическая ошибка на этапе компиляции
#pragma hdrstop #pragma argsused #include &lt;iostream.h&gt; void main() { double a; int index,i_max,i_min; double...

Проверка типа переменной на этапе компиляции
Добрый день. Прошу экспертов( ну или всех, кто это знает ) показать, как правильно &quot;повешать&quot; проверку времени компиляции на то,...

Вычисление размера массива на этапе компиляции
Нашел код который вычисляет размер массива на этапе компиляции Но сам код мне не понятен. Объясните плз #include &lt;iostream&gt; ...

Уменьшение исполняемого кода на этапе компиляции
Существует набор регистров (переменных), которые нужно заполнять. Например есть набор Reg1...Reg10 В зависимости от режима работы,...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru