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], то желательно иметь гарантию на уровне Стандарта, что выражение в квадратных скобках вычислится компилятором, что непонятного-то?
Re[13]: constexpr
От: rg45 СССР  
Дата: 14.01.23 22:53
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


Але, как твои 2+3 соотносятся с моим утверждением, что при помощи const можно определять константы времени компиляции?

Ну допустим, не смог компилятор сложить два числа, дальше что?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[14]: constexpr
От: T4r4sB Россия  
Дата: 14.01.23 22:58
Оценка:
Здравствуйте, rg45, Вы писали:

R>Але, как твои 2+3 соотносятся с моим утверждением, что при помощи const можно определять константы времени компиляции?


Твоё утверждение не является полным без упоминания того факта, что const не даёт никакой гарантии. То есть может определять, а может не определять.

R>Ну допустим, не смог компилятор сложить два числа, дальше что?


А дальше ошибка компиляции.
Re[15]: constexpr
От: rg45 СССР  
Дата: 14.01.23 23:13
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Твоё утверждение не является полным без упоминания того факта, что const не даёт никакой гарантии. То есть может определять, а может не определять.


Все правильно, может определять, а может не определять, вот поэтому я и написал
Автор: rg45
Дата: 14.01.23
"часто", а не "всегда". В исходном
Автор: Shmj
Дата: 14.01.23
же сообщении про модификатор const говорится, что это "просто const, который времени выполнения", что эквивалентно утрверждению "не может определять константу времени компиляции". Утверждалось, что не может, а я утверждаю, что может. У тебя как с логикой вообще?

R>>Ну допустим, не смог компилятор сложить два числа, дальше что?

TB>А дальше ошибка компиляции.

Как ошибка при компиляции записи "int a[2+3]" опровергает утверждение "модификатор const МОЖЕТ определять константу времени компиляции"?

P.S. На всякий случай, для доказательства того, что модификатор const МОЖЕТ использоваться для определения констант времени компиляции, достаточно какого-нибудь одного примера:

http://coliru.stacked-crooked.com/a/5425252ef5973753

#include <iostream>
#include <utility>

const int id = 42;

using MyInt42Type = std::integral_constant<int, id>;

int main()
{
    std::cout << MyInt42Type::value << std::endl;
}


Может? Может!
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 0:01 rg45 . Предыдущая версия . Еще …
Отредактировано 14.01.2023 23:56 rg45 . Предыдущая версия .
Отредактировано 14.01.2023 23:38 rg45 . Предыдущая версия .
Отредактировано 14.01.2023 23:35 rg45 . Предыдущая версия .
Re[16]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 10:03
Оценка: -2
Здравствуйте, rg45, Вы писали:

R>Как ошибка при компиляции записи "int a[2+3]" опровергает утверждение "модификатор const МОЖЕТ определять константу времени компиляции"?


Фразы надо проговаривать до конца, не вырывая из контекста, согласен? Потому что в живом языке если нету дополнения, что что-то может быть не так, то это неоднозначность как минимум. Если просто сказать "может определять константу времени компиляции", то можно подумать, что это обязательно будет определять константу времени компиляции, ведь обратного не сказано.
Re[17]: constexpr
От: rg45 СССР  
Дата: 15.01.23 10:47
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Фразы надо проговаривать до конца, не вырывая из контекста, согласен? Потому что в живом языке если нету дополнения, что что-то может быть не так, то это неоднозначность как минимум. Если просто сказать "может определять константу времени компиляции", то можно подумать, что это обязательно будет определять константу времени компиляции, ведь обратного не сказано.


Нет, нельзя так подумать. "Может определять константу времени компиляции" и "обязательно будет определять константу времени компиляции" — это разные высказывания. У человека, для котого из первого высказывания следует второе, явно что-то не в порядке с логикой.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 10:48 rg45 . Предыдущая версия .
Re[18]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 10:59
Оценка: -2
Здравствуйте, rg45, Вы писали:

R>У человека, для котого из первого высказывания следует второе, явно что-то не в порядке с логикой.


Не, у него обычная логика, заточенная за житейское понимание фраз человеческого языка.
Твоя фраза попросту неполная.
И всё, что не оговорено, можно понимать как угодно.
Чтоб не было неоднозначностей, следует говорить так: "Может определять константу времени компиляции, но не обязано".
Re[19]: constexpr
От: rg45 СССР  
Дата: 15.01.23 11:04
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Не, у него обычная логика, заточенная за житейское понимание фраз человеческого языка.


А при чем тут он? Речь о тебе.

TB>Твоя фраза попросту неполная.

TB>И всё, что не оговорено, можно понимать как угодно.
TB>Чтоб не было неоднозначностей, следует говорить так: "Может определять константу времени компиляции, но не обязано".

Все, что не оговорено — не оговорено не просто так, а потому, что просто не имеет значения в данном контексет. Фраза "Может определять константу времени компиляции" обладает необходимой полнотой в данном контексте. То, что у тебя возникают трудности с ее пониманием, определенно указывает на проблемы с логикой.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[20]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 11:16
Оценка: -1
Здравствуйте, rg45, Вы писали:

R>Все, что не оговорено — не оговорено не просто так, а потому, что просто не имеет значения в данном контексет.


А потому что автор фразы не умеет выражать мысли, либо просто очень хочет влезть в залупу.
Re[21]: constexpr
От: rg45 СССР  
Дата: 15.01.23 11:21
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>А потому что автор фразы не умеет выражать мысли, либо просто очень хочет влезть в залупу.


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

R>Сходи поплачь, может полегчает.


Я вообще сижу и чай пью, тут вроде ты бесишься только
Re[23]: constexpr
От: rg45 СССР  
Дата: 15.01.23 11:25
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Я вообще сижу и чай пью, тут вроде ты бесишься только


По-моему, ты выдаешь желаемое за действительное. Не я же в хамство
Автор: T4r4sB
Дата: 15.01.23
свалился, а ты.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 11:26 rg45 . Предыдущая версия .
Re[24]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 11:36
Оценка: :)
Здравствуйте, rg45, Вы писали:


R>По-моему, ты выдаешь желаемое за действительное. Не я же в хамство
Автор: T4r4sB
Дата: 15.01.23
свалился, а ты.


Ты начал нервничать и вести себя агрессивно гораздо раньше, примерно с "Re[7]: constexpr" (если что, я нихрена не могу понять, как тут делать ссылки на сообщения)
Re[25]: constexpr
От: rg45 СССР  
Дата: 15.01.23 11:38
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ты начал нервничать и вести себя агрессивно гораздо раньше, примерно с "Re[7]: constexpr"


В чем выразилось то, что я начал нервничать? Я в упор здесь не наблюдаю поводов для того, чтоб нервничать, вот честно. По-моему, ты просто спроецировал на меня свое собственное состояние, вот и все.

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

TB>(если что, я нихрена не могу понять, как тут делать ссылки на сообщения)


А ты не нервничай, и сразу поймешь
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 11:43 rg45 . Предыдущая версия . Еще …
Отредактировано 15.01.2023 11:42 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 11:39 rg45 . Предыдущая версия .
Re[26]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 11:42
Оценка:
Здравствуйте, rg45, Вы писали:

R>В чем выразилось то, что я начал нервничать? Я в упор здесь не наблюдаю поводов для того, чтоб нервничать, вот честно. По-моему, ты просто спроецировал на меня свое собственное состояние, вот и все.


Я был 100% нейтрален до этого твоего сообщения:

А я стесняюсь спросить, как твой вопрос связан с моим утверждением о том, что модификатор const можно использовать для объявления констант времени компиляции? Хорошо, давай допустим невероятное: компилятор не смог сложить константы — это как-то противоречит тому, что сказал я?

В этой цитате как минимум есть ерничество, сарказм, короче все признаки того, что ты взбесился и стал прыгать по потолку просто от того, что я уточнил твою фразу, и теперь ведёшь идиотский спор по поводу значений слов, на который мне в общем-то насрать.
Тебе 15 лет что ли?
Re[27]: constexpr
От: rg45 СССР  
Дата: 15.01.23 11:46
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>

TB>А я стесняюсь спросить, как твой вопрос связан с моим утверждением о том, что модификатор const можно использовать для объявления констант времени компиляции? Хорошо, давай допустим невероятное: компилятор не смог сложить константы — это как-то противоречит тому, что сказал я?

TB>В этой цитате как минимум есть ерничество, сарказм, короче все признаки того, что ты взбесился и стал прыгать по потолку просто от того, что я уточнил твою фразу, и теперь ведёшь идиотский спор по поводу значений слов, на который мне в общем-то насрать.

Где ту ерничество и сарказм? Где тут признаки, что я взбесился? Ты часом не свое ли состояние описываешь?


TB>Тебе 15 лет что ли?


Я думаю, что когда мне было 15 лет, тебя и на свете еще не было. Так что, будь повежливее, юноша.


P.S. Так а что с агрессией, о которой ты говорил здесь
Автор: T4r4sB
Дата: 15.01.23
? Покажешь, или снова разучился ссылки делать?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 11:52 rg45 . Предыдущая версия . Еще …
Отредактировано 15.01.2023 11:48 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 11:47 rg45 . Предыдущая версия .
Re[28]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 12:00
Оценка:
Здравствуйте, rg45, Вы писали:

R>Где ту ерничество и сарказм?


Ну вот же: "я стесняюсь спросить", "допустим невероятное". Как будто в каждом моём ответе ты видишь угрозу, что кто-то засомневается в твоей компетентности. Успокойся, на самом деле я сомневаюсь в ней давно, а не после твоих ответов в этой теме.

R>Где тут признаки, что я взбесился? Ты часом не свое ли состояние описываешь?


То, что ты лезешь в залупу, даже после того, как я написал ещё несколько ответов достаточно нейтрально.

R>Я думаю, что когда мне было 15 лет, тебя и на свете еще не было. Так что, будь повежливее, юноша.


Я в жизни видел таких где-то 20+ -летнего возраста, так что мне-то не гони.
Re[29]: constexpr
От: rg45 СССР  
Дата: 15.01.23 12:03
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


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

TB>Я в жизни видел таких где-то 20+ -летнего возраста, так что мне-то не гони.


Спорить будем или зассышь?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 15:47 rg45 . Предыдущая версия . Еще …
Отредактировано 15.01.2023 12:10 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:08 rg45 . Предыдущая версия .
Re[30]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 12:09
Оценка:
Здравствуйте, rg45, Вы писали:

R>Что ж тебе залупы то везде видятся. У тебя за щекой там залупа, что ли? Так ты выплюни вот и все проблемы.

R>Спорить будем или зассышь?

Пацанчик, закурить есть?
Re[31]: constexpr
От: rg45 СССР  
Дата: 15.01.23 12:10
Оценка:
Здравствуйте, T4r4sB, Вы писали:

R>>Спорить будем или зассышь?


TB>Пацанчик, закурить есть?


Понятно, зассышь. Гуляй, фуфел.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[32]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 12:16
Оценка:
Здравствуйте, rg45, Вы писали:

R>Понятно, зассышь. Гуляй, фуфел.


Семок отсыпь, а
Re[33]: constexpr
От: rg45 СССР  
Дата: 15.01.23 12:17
Оценка:
Здравствуйте, T4r4sB, Вы писали:

R>>Понятно, зассышь. Гуляй, фуфел.


TB>Семок отсыпь, а


Опущенным не подаю.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[34]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 12:19
Оценка:
Здравствуйте, rg45, Вы писали:

R>Опущенным не подаю.

Ого, какой дерзкий попался! А ещё за хорошего мальчика пытался себя выдать
Re[2]: constexpr
От: LuciferSaratov Россия  
Дата: 15.01.23 12:28
Оценка: 15 (1) +1
Здравствуйте, rg45, Вы писали:

R>А вот тебе про #define: 16. Избегайте макросов


объясните мне, пожалуйста, почему следует избегать макросов?
доводы из статьи по ссылке я встречал много раз.
меня они не убеждают и входят в противоречие с моим личным опытом.
я не претендую на звание эксперта по С++, но в своей работе я много работаю с кодом на этом языке.
специфика такая, что мне приходится работать со старым (10+ лет) и очень старым (20+ лет) кодом разного качества.

объясню своё непонимание на примере доводов из статьи по ссылке выше:

Основная проблема с макросами С++ заключается в том, что они выглядят гораздо привлекательнее, чем являются таковыми на самом деле. Макросы игнорируют области видимости, игнорируют прочие возможности и правила языка, и заменяют все символы, которые переопределяют при помощи директивы #define, до самого конца файла. Применение макросов внешне походит на имя или вызов функции, но не имеет с ними ничего общего. Макросы "негигиеничны", в том смысле, что они могут быть раскрыты неожиданно, причем превратиться в зависимости от контекста их использования в самые разные конструкции. Подстановка текста, выполняемая макросами, делает написание хотя бы в небольшой степени "приличного" макроса смесью искусства и черной магии.


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

Программисты, которые полагают, что тяжелее всего расшифровать ошибки, связанные с шаблонами, вероятно, просто никогда не имели дела с плохо написанными или неверно использованными макросами. Шаблоны являются частью системы типов С++, и тем самым позволяют компилятору куда лучше справляться с ними, чем с макросами, которые имеют мало общего с языком программирования. Хуже того, в отличие от шаблонов неверные макросы могут быть раскрыты в нечто, что в силу чистой случайности скомпилируется, не имея при этом никакого смысла. И наконец, ошибка в макросе обнаруживается только после того, как макрос раскрывается, а не при его определении.


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

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

однако понять, что не так при ошибке компиляции иных шаблонов, особенно в компиляторах MSVC не самых свежих, мне гораздо сложнее, чем разобраться в коде с макросами.
при этом нет никакого средства, чтобы раскрыть шаблон и превратить его в нешаблонный код.
Re[3]: constexpr
От: rg45 СССР  
Дата: 15.01.23 12:34
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

R>>А вот тебе про #define: 16. Избегайте макросов


LS>объясните мне, пожалуйста, почему следует избегать макросов?

LS>доводы из статьи по ссылке я встречал много раз.
LS>меня они не убеждают и входят в противоречие с моим личным опытом.
LS>я не претендую на звание эксперта по С++, но в своей работе я много работаю с кодом на этом языке.
LS>специфика такая, что мне приходится работать со старым (10+ лет) и очень старым (20+ лет) кодом разного качества.

"Избегайте" не означает же "полностью исключите". "Избегайте" означает, не употребляйте там, где без этого легко можно обойтись. Почему так — в статье написано достаточно хорошо, по-моему. Макросы не подчиняются правилам областей видимости, на функциональные макросы не распространяется ADL, для макросов нельзя использовать перегрузку и концепты и пр. Если статья не убеждает, то у меня тоже вряд ли получится.

Есть такие случаи, когда без макросов просто никак, например, описание разного рода типов со статической структурой. Использование макросов может придать таким описаниям очень приятный декларативный вид, легко изменяемый и расширяемый и избавить от написания громадного количества сопровождающего кода, такого как загрузка-выгрузка, сериализация-десериализация, операции разные — сравнения, сложения, вычитания, вывода-вывода и пр. Но это же не значит, что нужно начать повсеместно использовать макросы вместо констант и функций.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 14:23 rg45 . Предыдущая версия . Еще …
Отредактировано 15.01.2023 13:09 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 13:00 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:58 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:53 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:40 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:39 rg45 . Предыдущая версия .
Re[20]: constexpr
От: wander  
Дата: 15.01.23 16:22
Оценка: +1 -1
Здравствуйте, rg45.

Зря ты с ним сцепился. У человека govnokod.ru из головы все никак не выветрится.
Re[21]: constexpr
От: rg45 СССР  
Дата: 15.01.23 17:03
Оценка:
Здравствуйте, wander, Вы писали:

W>Зря ты с ним сцепился. У человека govnokod.ru из головы все никак не выветрится.


Да сам жалею теперь. Можно было просто игнорировать.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 17:09 rg45 . Предыдущая версия .
Re[3]: constexpr
От: Skorodum Россия  
Дата: 16.01.23 11:17
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

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

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

LS>на мой взгляд, хороший шаблонный код писать никак не проще.

Зато он предсказуемей.

LS>понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.

Сложные задачи — сложные средства.
Re[3]: constexpr
От: B0FEE664  
Дата: 16.01.23 11:21
Оценка: 3 (1)
Здравствуйте, LuciferSaratov, Вы писали:

LS>однако, по моему опыту, навести порядок в макросах не так уж и сложно, здесь автор сильно драматизирует.

А как можно навести порядок в макросах?
Пример из практики: в проекте используются две сторонние библиотеки и обе из них определяют один и тот же define но в разные значения. Как разрешить коллизию?

LS>написать хороший макрос тоже не очень сложно.

LS>на мой взгляд, хороший шаблонный код писать никак не проще.
LS>понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.

Так вроде как макросы — это не вопрос сложности. Это скорее вопрос безопасности.

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

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

Пример с макросом при смене компилятора:
#ifdef NDEBUG
#define IF_DEBUG   /##/
#else
#define IF_DEBUG
#endif

— ошибка на gcc, но ok для MS cl.exe

В обратную сторону:
enum class FunResult
{
   OK,
   NO_DATA,
   ERROR
};

— ok для Linux, но на windows: ERROR — это дефайн в константу и код не скомпилируется (зависит от порядка includ'ов)


Ну и классика по функциям и дефайнам min и max, из-за чего декларация этих функций выглядит нестандартно под windows:
отсюда
_EXPORT_STD template <class _Ty>
class numeric_limits : public _Num_base { // numeric limits for arbitrary type _Ty (say little or nothing)
public:
    _NODISCARD static constexpr _Ty(min)() noexcept {  // Шеф! Шеф! Что это было!?
        return _Ty();
    }

    _NODISCARD static constexpr _Ty(max)() noexcept { // Шеф! Шеф! Что это было!?
        return _Ty();
    }

    _NODISCARD static constexpr _Ty lowest() noexcept {
        return _Ty();
    }

    _NODISCARD static constexpr _Ty epsilon() noexcept {
        return _Ty();
    }


LS>это что касается портирования на другие компиляторы, однако и при отладке кода макросы мне никогда особых проблем не доставляли.

LS>в конце концов, макросы всегда можно раскрыть в нужной части кода и найти ошибку.
Ага. Занятие часа на 4: вспомнить опцию компилятора, настроить переменные окружения, запустить компиляцию этого отдельного файла и по косвенным признакам найти результат подстановки...

LS>однако понять, что не так при ошибке компиляции иных шаблонов, особенно в компиляторах MSVC не самых свежих, мне гораздо сложнее, чем разобраться в коде с макросами.

LS>при этом нет никакого средства, чтобы раскрыть шаблон и превратить его в нешаблонный код.
С шаблонами сложнее, но зато шаблоны — намного более мощный инструмент.
И каждый день — без права на ошибку...
Re[35]: constexpr
От: RonWilson Россия  
Дата: 16.01.23 11:42
Оценка:
Открыл сразу всю ветку, тыкнул произвольное сообщение и прям сразу все понятно: был вопрос про constexpr, ясный и понятный ответ:

Что ж тебе залупы то везде видятся. У тебя за щекой там залупа, что ли
Пацанчик, закурить есть?
Семок отсыпь, а


Популярный, однако, спецификатор
Re[3]: constexpr
От: B0FEE664  
Дата: 16.01.23 11:44
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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

Да, есть: consteval
И каждый день — без права на ошибку...
Re[21]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 11:51
Оценка:
Здравствуйте, wander, Вы писали:

W>Здравствуйте, rg45.


W>Зря ты с ним сцепился. У человека govnokod.ru из головы все никак не выветрится.


То есть ты считаешь, что неадекватное поведение рг45 это ок что ли?
Я вижу его сообщения в лучшем случае как " да как ты посмел уточнить то что я говорю и усомниться в полноте моих высказываний111", не так что ли?
Отредактировано 16.01.2023 11:53 T4r4sB . Предыдущая версия .
Re[4]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 11:54
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, T4r4sB, Вы писали:


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

BFE>Да, есть: consteval

О боже, скольно ж там теперь видов констант, отличия которых поймет только гурман
Re: constexpr
От: Igore Россия  
Дата: 16.01.23 12:34
Оценка:
Здравствуйте, Shmj, Вы писали:

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


S>Вообще зачем это нужно — можете ли пример привести?

Ты когда константы заводишь, как их описываешь?
CHUNK_SIZE = 2097152
// или
CHUNK_SIZE = 2 * 1024 * 1024

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

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

Это разные вещи, const != consexpr, #define != constexpr. static не входит в constexpr, вот это кстати было удивительно узнать, почему по умолчанию consexpr это не static inline consexpr.
Re[22]: constexpr
От: wander  
Дата: 16.01.23 13:51
Оценка: +1 -1
Здравствуйте, T4r4sB, Вы писали:

TB>То есть ты считаешь, что неадекватное поведение рг45 это ок что ли?

Я считаю, что неадекватно себя вести сначала начал ты.
Свое отношение к реакции рг45 на твой выпад в #12 (и особенно в #16) я уже высказал и получил от него адекватный ответ.

TB>Я вижу его сообщения в лучшем случае как " да как ты посмел уточнить то что я говорю и усомниться в полноте моих высказываний111", не так что ли?

Это только твое восприятие.
Отредактировано 16.01.2023 13:53 wander . Предыдущая версия . Еще …
Отредактировано 16.01.2023 13:52 wander . Предыдущая версия .
Re[23]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 14:48
Оценка:
Здравствуйте, wander, Вы писали:


W>Свое отношение к реакции рг45 на твой выпад в #12 (и особенно в #16) я уже высказал и получил от него адекватный ответ.


Его хамство в re7 и re9 ты в упор не видишь? Или ему можно? Это твой друг что ли?
Адекватный ответ — это кукушка хвалит петуха за то что хвалит он кукушку?
Что не так в ре16? Я спокойно сказал что его фраза может быть понята неоднозначно с точки зрения норм русского языка, что тут блин не так?
Отредактировано 16.01.2023 14:51 T4r4sB . Предыдущая версия . Еще …
Отредактировано 16.01.2023 14:49 T4r4sB . Предыдущая версия .
Re[5]: constexpr
От: B0FEE664  
Дата: 16.01.23 15:05
Оценка:
Здравствуйте, T4r4sB, Вы писали:

BFE>>Да, есть: consteval

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

Добро пожаловать в волшебный и разнообразный мир C++ !
И каждый день — без права на ошибку...
Re[6]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 15:12
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Добро пожаловать в волшебный и разнообразный мир C++ !


Да я-то в нем давно. Только на работе 14й стандарт, вот и беспокоюсь, не отстану ли.
Re[24]: constexpr
От: wander  
Дата: 16.01.23 16:56
Оценка: 16 (1) +2
Здравствуйте, T4r4sB, Вы писали:

TB>Его хамство в re7 и re9 ты в упор не видишь?

Там нет никакого хамства.
TB>Или ему можно?
Нет, ему не можно. Но хамства там нет.
TB>Это твой друг что ли?
Нет. Вообще ни разу. Мы за послоедние 10 лет едва ли парой фраз перекинулись и то только в этом разделе.
Просто ты несправедливо прикопался на ровном месте, вот я и среагировал.

TB>Адекватный ответ — это кукушка хвалит петуха за то что хвалит он кукушку?

Что?
Человек согласился, что зря ввязался в словесную перепалку с тобой.
Это адекватный ответ, потому что соответствует действительности.
Адекватный человек от неадекватного отличается как раз тем, что способен принять действительность.

TB>Что не так в ре16? Я спокойно сказал что его фраза может быть понята неоднозначно с точки зрения норм русского языка, что тут блин не так?

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