Здравствуйте, so5team, Вы писали:
A>>У меня написано, что нужно маркировать изменяемые параметры, а не константные. A>>Вот если сделать так, то при этом контроль будет. А хлама будет гораздо меньше.
S>Это можно сделать только в новом языке забив на совместимость. Например, в Rust-е так и поступили.
Ну, моё нытьё — оно действительно о том, что язык и его кумпилятор развиваются не туда. Имею право поныть.
S>Но ведь вы говорите о C++, а в C++ вот так. И вы можете либо забить на наличие const и отгрести приключений, либо принять тот факт, что в C++ через const отмечаются неизменяемые параметры и получать от этого бенефиты.
Для этого нужно ввести в стандарт всего одно ключевое слово neconst, и один флаг кумпилятора — как интерпретировать ситуацию, когда не задан ни тот ни другой модификатор. Я бы справился с этой задачей за один рабочий день.
Да, я уже лазил в потроха gcc, и научил его понимать переменные русскими буквами. Поэтому у меня длиннее. (ирония/самоирония)
S>И что-то мне подсказывает, что на Rust вы просто так не перейдете.
Разумеецца. Потому что геморроя много, а польза сомнительна.
Ну так и весь мир(тм) не переходит. Значит я не так уж и не прав.
Да, я люблю, когда язык мне помогает.
Но мне не нравится ситуация, когда я "тащу коня на себе". Конь не для этого.
<троллинг-мода>
Ну вот мы уже третий день разговариваем о том, что вы жить не можете без модификатора const.
А как вы отлаживаете ситуации, когда программист плюс с минусом перепутал?
Или у вас в программах нет плюсов и минусов (а есть только плюсы)?
</троллинг-мода>
PS.
А давайте на нашем сайте введём тег "троллинг-мода".
Мне кажется, что он будет востребован.
Здравствуйте, alpha21264, Вы писали:
A>Для этого нужно ввести в стандарт всего одно ключевое слово neconst, и один флаг кумпилятора — как интерпретировать ситуацию, когда не задан ни тот ни другой модификатор. Я бы справился с этой задачей за один рабочий день.
Здравствуйте, alpha21264, Вы писали:
A>Для этого нужно ввести в стандарт всего одно ключевое слово neconst, и один флаг кумпилятора — как интерпретировать ситуацию, когда не задан ни тот ни другой модификатор. Я бы справился с этой задачей за один рабочий день.
Его надо еще по-разному интерпретировать в твоих исходниках и в хидерах.
A>Да, я уже лазил в потроха gcc, и научил его понимать переменные русскими буквами. Поэтому у меня длиннее. (ирония/самоирония)
Я тебя расстрою. У ослика еще длиннее.
A>PS. A>А давайте на нашем сайте введём тег "троллинг-мода". A>Мне кажется, что он будет востребован. A>
Это такой способ сказать модератору, "а я в домике"?
Здравствуйте, Pzz, Вы писали:
Pzz>>>Мой любимый пример: x = (flag ? sin : cos)(y); Опыт показывает, что эта простая конструкция приводит многих собеседователей в тупик, в диапазоне от "а что это значит?" и до "а что, так можно?".
A>>Должен признаться, что понял, что делает этот код, только после 15 минут разглядывания.
Pzz>Ну, молодец.
Pzz>А я по молодости разок-другой такое в продакшене применил (разумеется не с sin/cos, с какой-то другой парой функций с одинаковым прототипом). Сейчас бы я так делать не стал. Народ реально не догоняет (к огромному моему удивлению).
Я бы тоже не стал использовать такую конструкцию, и не только потому, что это ставит кого-то в тупик, а потому что выражение (flag ? sin : cos) имеет тип указателя на функцию. Т.е дополнительная косвенность появляется совершенно необосновано. Рассуждения примерно те же, что и в случае ++i vs i++. Подробнее здесь: 9. Не пессимизируйте преждевременно.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
Pzz>>А я по молодости разок-другой такое в продакшене применил (разумеется не с sin/cos, с какой-то другой парой функций с одинаковым прототипом). Сейчас бы я так делать не стал. Народ реально не догоняет (к огромному моему удивлению).
R>Я бы тоже не стал использовать такую конструкцию, и не только потому, что это ставит кого-то в тупик, а потому что выражение (flag ? sin : cos) имеет тип указателя на функцию. Т.е дополнительная косвенность появляется совершенно необосновано. Рассуждения примерно те же, что и в случае ++i vs i++. Подробнее здесь: 9. Не пессимизируйте преждевременно.
Это вообще не проблема. Вменяемый компилятор эту косвенность свернёт.
Более того, на процессоре, который поддерживает MOV с условием (ARM, относительно свежие x86), он таки может выбрать косвенность и сэконимить один переход, вычислив выражение в скобках без переходов.
Здравствуйте, Pzz, Вы писали:
R>>Я бы тоже не стал использовать такую конструкцию, и не только потому, что это ставит кого-то в тупик, а потому что выражение (flag ? sin : cos) имеет тип указателя на функцию. Т.е дополнительная косвенность появляется совершенно необосновано. Рассуждения примерно те же, что и в случае ++i vs i++. Подробнее здесь: 9. Не пессимизируйте преждевременно.
Pzz>Это вообще не проблема. Вменяемый компилятор эту косвенность свернёт.
Стопудово свернет. Точно так же, как сгенерирует одинаковый код для ++i и i++. Но это вовсе не означает, что нет проблемы. Ты текст по ссылке-то открой.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Я бы тоже не стал использовать такую конструкцию, и не только потому, что это ставит кого-то в тупик, а потому что выражение (flag ? sin : cos) имеет тип указателя на функцию.
А, кстати говоря, есть ли гарантия, что у std::sin можно взять указатель на функцию?
Почему-то у меня в голове крутится смутное воспоминание на запрет на взятие указателя на функции стандартной библиотеки. Типа на самом деле std::some_name может и не быть функцией (вроде бы это для всяких isalnum и тому подобных актуально). Но уже не помню правда это или нет.
А тут уж без вариантов будет функция — не шаблон, не перегрузка и не функциональный объект. Вот если написать std::sin и std::cos, тогда получится облом.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Pzz, Вы писали:
A>>Для этого нужно ввести в стандарт всего одно ключевое слово neconst, и один флаг кумпилятора — как интерпретировать ситуацию, когда не задан ни тот ни другой модификатор. Я бы справился с этой задачей за один рабочий день.
Pzz>Его надо еще по-разному интерпретировать в твоих исходниках и в хидерах.
Ну, это если вообще ничего не менять в исходниках.
А если применить диалектический подход...
В смысле, что исходники будут постепенно приходить к новой реальности.
В своё время решили, что вот тут:
for( int i... )
i не будет существовать после цикла.
Ну и как-то все привыкли. И даже я.
Кстати, в этом дурацком проекте, на котором я словил свои проблемы,
для разных сишников нужны разные стандарты С++.
Потому что нельзя выбрать ни минимальную ни максимальную версию.
Вот где жопа-то.
A>>А давайте на нашем сайте введём тег "троллинг-мода". A>>Мне кажется, что он будет востребован.
Pzz>Это такой способ сказать модератору, "а я в домике"?
Ну, троллинг на нашем сайте вроде не запрещён.
Но я хочу явно предупредить недогадливого собеседника, когда я шучу, а когда я серёзен.
Ну если ему const-ы нужны, наверное ему и другие маркеры требуются.
Здравствуйте, alpha21264, Вы писали:
A>Ну если ему const-ы нужны
Таких как я очень и очень много, судя по количеству const-ов в нормальных кодовых базах и количеству рекомендаций применять const by default от лучших собаководов. Так что нас рать.
Здравствуйте, so5team, Вы писали:
S>Таких как я очень и очень много, судя по количеству const-ов в нормальных кодовых базах и количеству рекомендаций применять const by default от лучших собаководов. Так что нас рать.
И имя нам легион
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Pzz, Вы писали:
Pzz>Ты не представляешь, сколько раз мне приходилось спорить с коллегами на тему, с какого это такого хрена я оставляю в релизной сборке assert-ы (обычно не либсишные, а самодельные, которые умеют прощальные слова в лог писать, а не куда придётся).
С подходом по ассёртам в целом согласен, за исключением того, что в релизе у меня по умолчанию они не сваливают всё-таки программу, а пишут в журнал условие и стек. Ну и можно через переменную окружения настроить поведение (можно полностью отключить, можно вызывать abort). К сожалению, иногда стреляет и в проде. Хотя всё меньше и меньше, но бывает. Изначально у меня тоже abort звало в проде, но была ситуация, когда ассёрт был ошибочным, и раз упавшая программа уже не поднималась, это вызвало реакцию, которую я больше переживать не хочу
Pzz><...> я не и делаю отдельных отладочных сборок, зачем мне тестировать и отлаживать дебугную сборку, если пользователю я поставляю релизную?
Тут не соглашусь, в дебажной сборке кроме моих ассёртов включаются ещё и внутренние проверки stl/libc всякие там проверки валидности итераторов и прочее. Да и сам я вставляю больше проверок инвариантов, которые в прод. всё-таки слишком дороги с т.з. времени выполнения. Да, отсутствие оптимизаций делает программу другой, но я на практике не сталкивался с тем, чтобы дебаг работал, а релиз — нет именно из-за включившегося оптимизатора, UB с этим связанного и прочего. А вот доп. проверки дебажного варианта stl что-то, было, и ловили.
И дебаг — с ASAN, тоже в релиз не покладёшь.
А, ну и на дебаг у меня нет -Werror, т.к. по месту, бывает, втыкаю мусорный код для отладки, где nodiscard игнорируется или приведение типа не делается явное или знак/беззнак сравнивается или ещё чего подобное, что недопустимо в коммит, но во времянке можно.
Полагаю, что различия в этой части у нас с тобой связаны в различиях между C++ и go инструментариями (на go не писал, могу только предполагать).
Здравствуйте, so5team, Вы писали:
A>>Ну если ему const-ы нужны
S>Таких как я очень и очень много, судя по количеству const-ов в нормальных кодовых базах и количеству рекомендаций применять const by default от лучших собаководов. Так что нас рать.
Здравствуйте, alpha21264, Вы писали:
A>Для этого нужно ввести в стандарт всего одно ключевое слово neconst, и один флаг кумпилятора — как интерпретировать ситуацию, когда не задан ни тот ни другой модификатор. Я бы справился с этой задачей за один рабочий день.
И никто им не будет пользоваться, потому что старую кодовую базу никуда не деть, и любой твой новый код всё равно должен сопрягаться со старой кодовой базой
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, alpha21264, Вы писали:
A>>Топикстартер ноет, что компилятор захламляет выдачу. С лишним словом в исходниках я готов мириться.
M>Неправда. Ты ныл и о том, что const захламляет твои исходники.
Типа да. Но он сейчас стал таким занудным — на трёх экранах бессмысленной выдачи я это сообщение просмотрел.
A>>А вот то, что я могу пропустить важное предупреждение из-за огромного числа неважных и просто лишних, меня напрягает.
M>Эта проблема решается за неделю, ковыряясь в носу и попивая пиво
Ну то есть не решается вообще.
Потому что это программа, которую я использую в режиме час-перед-сном.
И в таком режиме рабочая сорокачасовая неделя означает,
что я должен потратить 40 вечеров своей бесценной жизни.
Но ты веришь (в религиозном смысле) что этот путь слёз и страданий необходим.
Потому что один раз за всё время существования вселенной эта программа,
которую я использую в качестве хобби, может выдать неверный результат.
Ну да, это достойно восхищения. Путь самурая и вот это всё.
Здравствуйте, so5team, Вы писали:
A>>А ещё больше меня напрягает, что нормально работающую программу слишком вумный кумпилятор насильно ложит в корку.
S>Простите, а под "нормально работающей программой" вы все еще понимаете программу, в которой функции забывают возвращать значения (как в вашем стартовом сообщении этой темы)?
Под нормально работающей программой я понимаю видеоредактор, которым я наредактировал уже чёрт-знает-сколько видео.
И да, в ней функции забывают возвращать значения. Это не мешает порождать видео длинной до двух часов.
Здравствуйте, alpha21264, Вы писали:
M>>Неправда. Ты ныл и о том, что const захламляет твои исходники.
A>Прямая цитата из A>https://rsdn.org/forum/cpp/8971932.1
A>Типа да. Но он сейчас стал таким занудным — на трёх экранах бессмысленной выдачи я это сообщение просмотрел.
Мне лень искать, где ты ныл про const, которые захламляют код
A>>>А вот то, что я могу пропустить важное предупреждение из-за огромного числа неважных и просто лишних, меня напрягает.
M>>Эта проблема решается за неделю, ковыряясь в носу и попивая пиво
A>Ну то есть не решается вообще. A>Потому что это программа, которую я использую в режиме час-перед-сном. A>И в таком режиме рабочая сорокачасовая неделя означает, A>что я должен потратить 40 вечеров своей бесценной жизни.
A>Но ты веришь (в религиозном смысле) что этот путь слёз и страданий необходим. A>Потому что один раз за всё время существования вселенной эта программа, A>которую я использую в качестве хобби, может выдать неверный результат.
A>Ну да, это достойно восхищения. Путь самурая и вот это всё.