constexpr
От: Shmj Ниоткуда  
Дата: 13.01.23 21:13
Оценка:
Как я понимаю, старый стиль, когда константы определялись виде #define — деканонизировали и предали анафеме. Теперь есть constexpr.

constexpr для времени компиляции, хотя тип проверяется. Вообще зачем это нужно — можете ли пример привести? Вроде режим компиляции — это отдельный тьюринг-полный язык, но нафига?

Всегда ли вы используете constexpr для констант?

Почему не использовать просто const, который времени выполнения?
Re: constexpr
От: rg45 СССР  
Дата: 13.01.23 21:29
Оценка: +7
Здравствуйте, Shmj, Вы писали:

S>Как я понимаю, старый стиль, когда константы определялись виде #define — деканонизировали и предали анафеме. Теперь есть constexpr.


Задолго до появления constextr для определения констант было общепринято использовать просто const. Ты, как обычно, слышал звон, но не знаешь, где он. Почитал бы что-нибудь, что ли.

Вот тебе про const: 15. Активно используйте const
А вот тебе про #define: 16. Избегайте макросов

Книга 2005 года — тогда слова constexpr никто даже не знал еще.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: constexpr
От: T4r4sB Россия  
Дата: 13.01.23 21:32
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Почему не использовать просто const, который времени выполнения?


Чтоб не тратить время при старте приложения.
Более правильная постановка вопроса: почему бы вместо этого мета-онанизма, который пишется как бы на особом языке, не использовать внешний скрипт с кодогенерацией, который и рассчитает все эти константы?
Re: constexpr
От: rg45 СССР  
Дата: 13.01.23 21:35
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Почему не использовать просто const, который времени выполнения?


Откуда ты черпаешь эту ересь? C помощью const очень часто задавались как раз таки константы времени компиляции.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: constexpr
От: T4r4sB Россия  
Дата: 13.01.23 21:44
Оценка:
Здравствуйте, rg45, Вы писали:

R> C помощью const очень часто задавались как раз таки константы времени компиляции.


Где гарантия, что результат будет вычислен при компиляции? Есть какой-то список операций, дающий гарантию?
Re[3]: constexpr
От: rg45 СССР  
Дата: 13.01.23 21:47
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Где гарантия, что результат будет вычислен при компиляции? Есть какой-то список операций, дающий гарантию?


Есть такие места, где кроме констант компиляции ничего больше использовать нельзя, например, параметры шаблонов, значения перечислений, ключи оператора switch, размеры массивов и пр. Вот эти места, собственно, и являлись гарантами.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 13.01.2023 21:48 rg45 . Предыдущая версия .
Re[4]: constexpr
От: T4r4sB Россия  
Дата: 13.01.23 21:51
Оценка:
Здравствуйте, rg45, Вы писали:

R>Есть такие места, где кроме констант компиляции ничего больше использовать нельзя, например, параметры шаблонов, значения перечислений, ключи оператора switch, размеры массивов и пр. Вот эти места, собственно, и являлись гарантами.


Ну допустим, я напишу
int a[2+3];

Какой шанс, что какой-то компилятор не захочет складывать 2+3? И что говорит стандарт?
Re[5]: constexpr
От: rg45 СССР  
Дата: 13.01.23 22:16
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ну допустим, я напишу

TB>
TB>int a[2+3];
TB>

TB>Какой шанс, что какой-то компилятор не захочет складывать 2+3? И что говорит стандарт?

Так а чего ты сам не посмотришь, что говорит стандарт?

Вот про массивы: https://timsong-cpp.github.io/cppwp/dcl.array#1
Вот про выражения, которыми задаются размеры массивов: https://timsong-cpp.github.io/cppwp/expr.const#nt:constant-expression

Вот про все вместе более популярным языком: https://en.cppreference.com/w/cpp/language/array

По моим оценкам, шансы близки к нулю, если компилятор хоть немного вменяемый, конечно.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[6]: constexpr
От: T4r4sB Россия  
Дата: 13.01.23 22:47
Оценка:
Здравствуйте, rg45, Вы писали:

R>По моим оценкам, шансы близки к нулю, если компилятор хоть немного вменяемый, конечно.


Ну нужны не оценки, а гарантия на уровне стандарта, что компилятор сможет сложить константы.
Вроде тут есть: https://en.cppreference.com/w/cpp/language/constant_expression
То есть читаешь 37 пунктов, сложения констант там нет, значит компилятор обязан справиться
Re[7]: constexpr
От: rg45 СССР  
Дата: 13.01.23 22:52
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ну нужны не оценки, а гарантия на уровне стандарта, что компилятор сможет сложить константы.

TB>Вроде тут есть: https://en.cppreference.com/w/cpp/language/constant_expression
TB>То есть читаешь 37 пунктов, сложения констант там нет, значит компилятор обязан справиться

А я стесняюсь спросить, как твой вопрос связан с моим утверждением
Автор: rg45
Дата: 14.01.23
о том, что модификатор const можно использовать для объявления констант времени компиляции? Хорошо, давай допустим невероятное: компилятор не смог сложить константы — это как-то противоречит тому, что сказал я?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 13.01.2023 22:52 rg45 . Предыдущая версия .
Re[8]: constexpr
От: T4r4sB Россия  
Дата: 13.01.23 22:54
Оценка:
Здравствуйте, rg45, Вы писали:

R>А я стесняюсь спросить, как твой вопрос связан с моим утверждением
Автор: rg45
Дата: 14.01.23
о том, что модификатор const можно использовать для объявления констант времени компиляции?


Отсутствием гарантий, что компилятор действительно вычислит константу.
Re[9]: constexpr
От: rg45 СССР  
Дата: 13.01.23 23:14
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Отсутствием гарантий, что компилятор действительно вычислит константу.


Для меня гарантии — это то как я могу использовать объявленную сущность, что я могу с ней делать. Мне важно, чтоб я мог ее использовать в определенных местах, где по нормам языка заявлено использование константных выражений:

const int N = 42;

enum E { e = N };

int a[N] {};

std::array<int, N> ar{};

switch (val)
{
case N: . . .
}


Если компилятор сможет каким-то магическим образом обеспечить мне такое использование без вычисления константы, то на здоровье — я все равно этого никак не почувствую.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: constexpr
От: пффф  
Дата: 13.01.23 23:19
Оценка:
Здравствуйте, T4r4sB, Вы писали:

R>>По моим оценкам, шансы близки к нулю, если компилятор хоть немного вменяемый, конечно.


TB>Ну нужны не оценки, а гарантия на уровне стандарта, что компилятор сможет сложить константы.

TB>Вроде тут есть: https://en.cppreference.com/w/cpp/language/constant_expression
TB>То есть читаешь 37 пунктов, сложения констант там нет, значит компилятор обязан справиться

А давно в плюсики завезли массивы переменного размера? Чтобы в рантайме считалось?
Re[8]: constexpr
От: rg45 СССР  
Дата: 13.01.23 23:25
Оценка:
Здравствуйте, пффф, Вы писали:

П>А давно в плюсики завезли массивы переменного размера? Чтобы в рантайме считалось?


Только как расширения. По стандарту только константные размеры предусмотрены.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[9]: constexpr
От: пффф  
Дата: 13.01.23 23:28
Оценка: +1
Здравствуйте, rg45, Вы писали:

П>>А давно в плюсики завезли массивы переменного размера? Чтобы в рантайме считалось?


R>Только как расширения. По стандарту только константные размеры предусмотрены.


Ну вот я именно про это. Если компилятор не может вычислить эту константу, он должен сложить лапки
Re: constexpr
От: rudzuk  
Дата: 13.01.23 23:56
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S> constexpr для времени компиляции, хотя тип проверяется. Вообще зачем это нужно — можете ли пример привести? Вроде режим компиляции — это отдельный тьюринг-полный язык, но нафига?


Вот для чего: https://wasm.in/blogs/meta-programmirovanie-s-i-obfuskacija.703/ Офигенская же вещь!
avalon/3.0.2
Re: constexpr
От: ботаныч Интернет https://youtube.com/shorts/eapWB7W8hEE
Дата: 14.01.23 06:28
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Как я понимаю, старый стиль, когда константы определялись виде #define

коллега (даже не читая ответы, то, что вы употребили есть препроцссор — вещь изначально не относящаяся к языку, т.е. в АСТ оно не попадает, оно генерирует то. что попадет в АСТ).
да а слово (ключевое) const именно с языка.
Re[10]: constexpr
От: T4r4sB Россия  
Дата: 14.01.23 22:25
Оценка:
Здравствуйте, rg45, Вы писали:

R>Если компилятор сможет каким-то магическим образом обеспечить мне такое использование без вычисления константы, то на здоровье — я все равно этого никак не почувствую.


А если при попытке использовать другой компилятор окажется, что константа не вычислилась, то почувствуешь.
Re[11]: constexpr
От: rg45 СССР  
Дата: 14.01.23 22:39
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>А если при попытке использовать другой компилятор окажется, что константа не вычислилась, то почувствуешь.


Если окажется, то почувствую. А если динозавр, то бабушка может стать дедушкой. Ты что-то предложить мне хочешь, или какова цель нашей дискуссии?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 14.01.2023 22:47 rg45 . Предыдущая версия . Еще …
Отредактировано 14.01.2023 22:41 rg45 . Предыдущая версия .
Отредактировано 14.01.2023 22:40 rg45 . Предыдущая версия .
Re[12]: constexpr
От: T4r4sB Россия  
Дата: 14.01.23 22:51
Оценка:
Здравствуйте, rg45, Вы писали:

R> А если динозавр, то бабушка может стать дедушкой.


Алё, я говорю, что если ты пишешь int a[2+3], то желательно иметь гарантию на уровне Стандарта, что выражение в квадратных скобках вычислится компилятором, что непонятного-то?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.