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

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

05.06.2018, 09:08. Показов 5608. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru