Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 08.05.2019
Сообщений: 17

Constexpr для результата функции

03.02.2023, 18:43. Показов 2228. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется строка
C++
1
static constexpr char str[] = "\t%3d\n";
Я также хочу сделать типа такого:
C++
1
static constexpr size_t len = strlen(str);
Компилятор ругается, что переменная len должна быть инициализирована константным выражением. Вопрос: как получить константное выражение из strlen()? Я так понимаю, const_cast здесь не поможет.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2023, 18:43
Ответы с готовыми решениями:

Constexpr функции
В продолжении моего вопроса в этой теме - https://www.cyberforum.ru/cpp-beginners/thread1913846.html Хотел бы уточнить. У нас есть вот...

Рекурсивный вызов constexpr функции
Приветствую уважаемые форумчане. Возможно ли реализовать указанное в теме телодвижение, с условием передачи в качестве входного параметра в...

Присваивание constexpr к non-constexpr
constexpr float pi = 3.14159265; void some_fun() { float angle = 45.0f*(pi/180.0f); std::cout << angle; } В консоли...

29
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.02.2023, 20:28
Студворк — интернет-сервис помощи студентам
int param* тут у меня опечатка, имелось ввиду указатель на int: int* param
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
03.02.2023, 20:40
Цитата Сообщение от Undisputed Посмотреть сообщение
Все правильно. size это и делает, возвращает длину массива,
Цитата Сообщение от Undisputed Посмотреть сообщение
Если бы я поместил -1 внутри функции size и назвал ее strlen, тогда это замечание было бы уместно.
Вы вообще вникали в то, что хочет ТС?
Цитата Сообщение от bfin Посмотреть сообщение
как получить константное выражение из strlen()?
У вас фиеричная логика.
Вместо того, что бы представить автору constexpr функцию strlen, вы ему втюхали size, и при этом притензий вы не принимаете.
А то что size не способна корректно вычислять длину строки, это у вас такая норма жизни.
Вы ж не обещали, что size сможет заменить strlen.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.02.2023, 20:58
eva2326,
Никто никому ничего не втюхивал. Просили способ узнать длину конкретной compile time строки, я предложил один из возможных рабочих вариантов. Так же я нигде не говорил, что size считает длину строки, а замечания идут такие, что якобы я утверждал что-то подобное. Нет конечно, естественно size считает длину массива, а так как строка в данном случае это массив char и без запасных элементов, то все ведь ок.

По-моему все это должно быть очевидно
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
03.02.2023, 21:41
Цитата Сообщение от Undisputed Посмотреть сообщение
Просили способ узнать длину конкретной compile time строки
Не выдумывайте.
Автор не просил узнать длину конкретной compile time строки
Он спросил как организовать constexpr strlen

Вы вообще хотя бы немножко, хотя бы после всех замечаний удостоужились прочитать, о чем на самом деле спросил автор?

Цитата Сообщение от bfin Посмотреть сообщение
Вопрос: как получить константное выражение из strlen()?
Ни о каких конкретных компалтайм строках здесь речи не идет.
Речь идет об strlen, которая способна вычислять значение времени компиляции.

Цитата Сообщение от Undisputed Посмотреть сообщение
замечания идут такие, что якобы я утверждал что-то подобное
Замечание заключается в том, что вас никто не просил вычислять длину массива.
Вас попросили вычислить длину строки.

Цитата Сообщение от Undisputed Посмотреть сообщение
а так как строка в данном случае это массив char и без запасных элементов, то все ведь ок.
Вот так выглядит ваша логика со стороны:

C++
1
2
3
4
5
6
7
constexpr size_t len(const char*) noexcept { return 5; }
 
int main()
{
    // так как в данном случае это строка из 5 букв, то все ведь ok
    std::cout << len("hello");
}
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.02.2023, 22:13
eva2326,
Автор не просил узнать длину конкретной compile time строки
Имеется строка
А это что такое? Неужели указание на конкретную строку?

Вас попросили вычислить длину строки.
Я же подсказал как вычислить?

Короче ребята, вы победили, только отстаньте. Больше здесь отвечать не собираюсь.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
03.02.2023, 22:34
Цитата Сообщение от Undisputed Посмотреть сообщение
А это что такое? Неужели указание на конкретную строку?
Это - вводная информация ТС перед тем, как он задал свой вопрос.
ТС привел строку для примера, что бы было понятно, чего он хочет.
Очевидно жеж, что предполагается работать с разными строками, а не только с конкретным литералом из 5 букв.

Цитата Сообщение от Undisputed Посмотреть сообщение
Я же подсказал как вычислить?
Как вычислить подсказал SmallEvil (см #3)

А вы подсказали, как не надо делать.
Вас просили показать strlen, а вы показали size, с таким своеобразным отношением к делу: и так сойдет.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.02.2023, 00:13
Цитата Сообщение от eva2326 Посмотреть сообщение
Размер строки и длина массива - это разные вещи.
в данном случае размер массива равен длине строкового литера минус один

Цитата Сообщение от eva2326 Посмотреть сообщение
Вас просили показать strlen, а вы показали size, с таким своеобразным отношением к делу: и так сойдет.
для чего ТС тогда предоставил массив инициализированный литералом, то есть это изначально массив а не строка. и size уместен.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2023, 01:26
bfin,если обернуть функцией, то компилятор не возражает против инициализации статического указателя на функцию (под капотом). А сонст экспр данное в области класса он не ест. Тут как с ребёнком. Если хотите накормить - оберните во что-то приемлемое. Может и съест)
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
36
37
38
39
40
41
#include <iostream>
#include <cstring>
using namespace std;
 
constexpr const char* str="mama";
constexpr size_t string_len()
{
    return strlen(str);
}
 
constexpr size_t string_length=strlen(str);
 
constexpr char str_arr[]="mama";
constexpr size_t string_arr_len()
{
    return strlen(str_arr);
}
 
constexpr size_t string_arr_length=strlen(str_arr);
 
struct test_stat_str
{
    static
    constexpr const char str_arr[]="mama";
 
   //
   //static constexpr size_t string_arr_length=strlen(str_arr);//fails
 
    constexpr size_t string_arr_len()//compils
    {
        return strlen(str_arr);
    }
};
 
int main()
{
std::cout<<string_len()<<'\n';
std::cout<<test_stat_str{}.string_arr_len();
 
    return 0;
}
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
04.02.2023, 05:16
Цитата Сообщение от IGPIGP Посмотреть сообщение
если обернуть функцией,
Никакого отношения к оборачиванию это не имеет. Этот код принимается GCC только благодаря багу в GCC: GCC ошибочно рассматривает известные ему built-in функции, как constexpr, несмотря на то, что они не являются constexpr в С++. Вызов built-in strlen в constexpr контексте будет приниматься GCC и без оборачивания, как видно в строке 11. Так что не ясно, зачем тут было что-то вообще городить для компилятора, который и так напрямую компилирует код из исходного вопроса.

Достаточно добавить -fno-builtin и GCC начнет вести себя корректно.

В С++ strlen не является constexpr и в С++ не разрешается вызывать не-constexpr функции из constexpr функций, то никакое оборачивание здесь ситуации не спасет

C++
1
2
3
4
constexpr size_t string_len()
{
    return strlen(str);
}
Сразу ошибка компиляции.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.02.2023, 00:21
У TC присутствует слово static. Я предположил, что это часть из объявлений в классе. Однако в контексте класса компилятор отказался компилировать данное объявление. Когда же я обернул его как показано всё прошло гладко. Там в комменте я это указал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2023, 00:21

Использование constexpr с "не constexpr" обьектами
Есть вот такой вот класс class Point { public: constexpr Point(double xVal = 0, double yVal = 0) noexcept :...

Свой класс для работы с constexpr
Всем привет! Разбираясь с std::initializer_list и std::array, решил сделать как бы свой ArrayAutoSize. То есть что бы он делал...

Ошибка undefined reference для static constexpr переменной
Добрый день. Есть код: template&lt;typename K, typename V&gt; struct Pair { K key; V value; }; struct Test {

Сервис для изучения c++ кода (+ еще одна тема о constexpr в качестве примера)?
Необходим сервис, который смог бы продемонстрировать внутреннюю работу библиотек , компилятора и выделения памяти в реальном времени....

Алгоритм для обработки результата функции
Здравствуйте! Столкнулся с такой задачей... ДАНО: - Имеется функция, результатом которой является некое число строго определенной...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru