LINUX.ORG.RU

Rust и типобезопасность

 ,


3

7

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

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

Почитав документацию:

The as keyword does safe casting

Набросал такой примерчик:

fn main() {
        let a: f64 = std::f64::MAX;  // данное значение просто пример "большого числа"
        let b = a as i64;
        println!("{}", b);
}

Вопросы:

1) С какой стати это вообще компилируется?

2) Да, f64 и i64 нужно одно и то же количество битов для хранения значения, ну и что?

3) Почему результат меняет знак?

Представьте, что какой-то тех. процесс идет, и определенный параметр нельзя изменять скачкообразно, иначе физически система (по крайней мере, один из компонентов) выйдет из строя (встанет в раскоряку, взорвется, выпустит токсичный газ, убивающий 100тыс. населения; нужное подчеркнуть). И вот значение в f64 положительное и увеличивается постепенно, с i64 все вроде в порядке (и тестирование проходит на тестовых значениях), и вдруг хренак! и уже -9223372036854775808

Как так?

★★★★★
Ответ на: комментарий от fsb4000

По большей части да. Другое дело, что это более-менее затронет реальные программы лет через 10-15, но это уже другая тема. Да даже и тогда использоваться будет не всеми (луддиты-с), что несколько убивает цель.

Из претензий разве то, что три синтаксиса для концептов – оверкилл, но это лично мои придирки.

Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

Ну и самое важное, маня. Ты обделался ещё с одним фундаментальным свойством мироздания. Что-то менее ограниченное всегда можно ограничить, но не наоборот.

Поэтому ничего не мешает ограничить тип в С++, но вот получить тип в твоём мусоре - невозможно. Примеры с концептами тебе уже показывали.

anonymous
()
Ответ на: комментарий от Siborgium

Другое дело, что это более-менее затронет реальные программы лет через 10-15, но это уже другая тема. Да даже и тогда использоваться будет не всеми (луддиты-с), что несколько убивает цель.

Когда твой недоязычок затронет реальные программы? Расскажешь? У тебя опять методичка течёт.

anonymous
()
Ответ на: комментарий от anonymous

ничего не мешает ограничить тип в С++

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

получить тип в твоём мусоре - невозможно

А зачем мне получать тип? Ну, конечно, можно построить ситуации с, скажем, if constexpr на основе типа, но это можно реализовать в обход, не говоря уже о том, что возникает такая потребность редко.

Когда твой недоязычок затронет реальные программы?

Не смешно, царь. Хотя доля Rust невелика, существуют успешные проекты, написанные на нем.

Теперь тебе вопрос: когда те фичи, про которые ты рассказываешь, попадут в мейнстрим? Многие реальные программы до сих пор пишутся в стиле Си с классами, к моему сожалению.

Siborgium ★★★★★
()

ITT весь тред в крестофанатиках со стокгольмским синдромом.

УРА! В плюсах есть Мощная Система Темплейтов.

Напоминаю: темплейты это такой динамически типизированный язык времени компиляции внутри плюсов. В нем, как в большинстве динамических языков есть всего несколько типов: typename, int, short и тд (условно, целые типы и тип «плюсовый тип»). Подавляющее количество плюсового кода использует typename как основной тип, даже числовые типы в коде с большим количеством темплейтов оборачивают в typename (см. boost::mpl::int_, std::integral_constant). Тут же возникает duck-typing для typename. Например можно для любого typename T, можно написать T.hello(), и ошибка возникнет (или нет) только в момент исполнения (инстанцирования) темплейтов. Если, по какой-то причине исполнение темплейтов не дойдет до этого места - ошибки не будет.

Что же происходит когда во время исполнения кода динамического язычка возникает не обработанная ошибка? Правильно! Стектрейс на два экрана!

Ровно так и выглядят все ошибки компиляции с темплейтами на плюсах. Это просто стектрейс как в каком-нибудь питоне.

Уау! В плюсы ввели концепты! Теперь можно вводить свои типы для языка темплейтов и стектрейс будет короче (до первого тайп мисматч). Только вся кодовая база, на данный момент, не на концептах. И typename никуда не дели.

Поздравляем, теперь в плюсах есть не пародия на JavaScript, а пародия на TypeScript! Это большой прогресс, на самом деле (не шутка).

Ребят, посоветуйте unit testing framework для темпелейтов!

Kuzy ★★★
()
Ответ на: комментарий от htower_

Ну давай, поставь оттуда свежий gcc без рутовских прав :)

Маня, как же ты поставил гцц тогда, если прав нету? И побежал показывать, где ты болтал до этого про какие-то права.

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

anonymous
()
Ответ на: комментарий от Siborgium

Насколько твои потуги нелепы и позорны.

Не мешает ничего, кроме того, что из мажорных компиляторов пока лишь 2 поддерживают эти фичи

Маня, ты обделался. Поддерживают все компиляторы мажорные. И шланг и гцц и даже маздайское говно.

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

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

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

А зачем мне получать тип?

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

Ну, конечно, можно построить ситуации с, скажем, if constexpr на основе типа, но это можно реализовать в обход, не говоря уже о том, что возникает такая потребность редко.

Никакого обхода у тебя нет. Ты обделался. Зачем болтаешь о том, о чём не знаешь?

Не смешно, царь. Хотя доля Rust невелика, существуют успешные проекты, написанные на нем.

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

К тому же, ты болтал не про программы, а про переход. Вот побежал показывать что и где перешло на говнораст.

Теперь тебе вопрос: когда те фичи, про которые ты рассказываешь, попадут в мейнстрим? Многие реальные программы до сих пор пишутся в стиле Си с классами, к моему сожалению.

Я тебе сказал. Все твои потуги - нелепая ретрансляция услышанной в интернете пропаганды. Когда твоё говно попадёт в мейнтрим. Ему 10-15 лет. Побежал показывать.

anonymous
()
Ответ на: комментарий от anonymous

Маня, как же ты поставил гцц тогда, если прав нету?

Маня, я туда вообще ничего не ставил, я пришел туда как обычный юзер. Работал на вычислительных кластерах когда-нибудь? Если да, то должен знать, что софт там как правило «стабильный» (т.е. древний) и поставить что-то дополнительное можно только путём длительной переписки с админами, которым, как правило, лень что-то менять («работает - не трогай»). Но, судя по твоим тупым высерам, ты типиный юзер локалхоста, конпеляющий свои гениальные хеллоуворлды транковыми версиями gcc/clang.

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

Ты сегодня самокритичен, царёк :)

htower_ ★★
()
Последнее исправление: htower_ (всего исправлений: 1)
Ответ на: комментарий от Kuzy

Очередной нелепый эксперт-абалбол.

Напоминаю: темплейты это такой динамически типизированный язык времени компиляции внутри плюсов.

Ты опозорился, маня. Никакого языка нет.

В нем, как в большинстве динамических языков есть всего несколько типов: typename, int, short и тд (условно, целые типы и тип «плюсовый тип»).

Опять опозорился. Я не знаю как эту шизу комментировать. Про auto, шаблонные параметры и прочее эксперт не слышал? Про функции? Про указатели/ссылки? Про специализацию? Про массивы. Уровень нелепости потуг зашкаливает.

даже числовые типы в коде с большим количеством темплейтов оборачивают в typename (см. boost::mpl::int_, std::integral_constant).

Уровень представления балабола о теме равны нулю. Иди что-то почитай на тему типов и значениях как типах. Это как-бы, трепло, передовые достижения.

Тут же возникает duck-typing для typename.

Нету ты там ничего такого. Ты опять опозорился. Утиная типизация - это просто названия для бедных и слабых. В реальности её там нет. Просто С++ генерирует все возможно комбинации типов/ytnbgjd.

Например можно для любого typename T, можно написать T.hello(), и ошибка возникнет (или нет) только в момент исполнения (инстанцирования) темплейтов.

Маня, ты опять опозорился. Никакой ошибки в принципе существовать не может, потому как никакой проверки быть не может. Никакого кода нет. И никакой исполнения нет - меньше нелепой херни неси.

Если, по какой-то причине исполнение темплейтов не дойдет до этого места - ошибки не будет.

До куда? Какой исполнение? Срочно за парту.

Что же происходит когда во время исполнения кода динамического язычка возникает не обработанная ошибка? Правильно! Стектрейс на два экрана!

О боже, ну давай трепло. Побежал показывать и обосновывать за стектрейс. Живо. Пример выше тебе дали.

anonymous
()
Ответ на: комментарий от htower_

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

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

Задача ясна? Действуй.

anonymous
()
Ответ на: комментарий от htower_

Что-бы окончательно доказать всю нелепость этого трепла - поиграем в игру. Первая ссылка в гугле: https://stackoverflow.com/questions/36651091/how-to-install-packages-in-linux-centos-without-root-user-with-automatic-depen

Трепло умножено на ноль. Ну и финалочка, сколько готов поставить на то, трепло, что я без рута на centos7 запущу этот gcc. Или к мамке плакать побежишь? Оправдывайся.

anonymous
()
Ответ на: комментарий от anonymous

Маня, потуги после меня не волнуют. Побежал показывать эти потуги изначально, в изначальных условиях.

Маня, твои потуги меня не волнуют. Побежал показывать блог на C++. Быстро побежал, трепло. Задача ясна? Действуй.

Меня не волнует то, что эникей с помойки придумал

Можно подумать, мнение шизоидного царька кого-то волнует. Бегом пили блог на C++, у вас там в СФУ как раз карантин/каникулы :)

htower_ ★★
()
Ответ на: комментарий от anonymous

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

то будет этот код переписывать на говнораст

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

Программ на новых крестах больше.

Да конечно больше, хоть в сто, хоть в сто тысяч раз. Это не говорит ничего ни о крестах, ни о расте, кроме того, что у первых больше юзеров, что неудивительно. Что забавно, я даже не говорил, что программ на новых крестах меньше, это ты тоже придумал. Я лишь сказал, что существуют успешные проекты на расте. Ты меня упрекаешь в невежестве, при этом делаешь логические ошибки уровня школьника.

не про программы, а про переход

Да нет, я как раз про программы говорил. И опять ты додумываешь за меня. Бинго!

К тому же, тебе уже привели пример зачем получать тип. Вывод типа возврата.

Где пример кода-то? Дай хоть какую-то конкретику, ты одни лозунги кидаешь. Не говоря уже о том, что вывод типа возврата не очень сочетается с выведением типов по контексту и в целом не является чем-то хорошим, порождает класс ошибок.

Siborgium ★★★★★
()
Ответ на: комментарий от anonymous

я без рута на centos7 запущу этот gcc

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

htower_ ★★
()
Ответ на: комментарий от anonymous

Шутка.

Ура!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

На форум вернулся

Великий Учитель и Вождь всех Си-хнутых и Плюснутых - Царь!

https://www.youtube.com/watch?v=-coc32ilIzk «Жить стало лучше, жить стало веселее». Сталин

PS: Кстати я плюснутый симпатизирующий сихнутым.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Да, местный юродивый снова тут появился. Пусть бережёт себя от короновируса, а то совсем скучно без него станет :)

htower_ ★★
()
Ответ на: комментарий от Siborgium

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

Этот шизик всех обвиняет в «сектантстве» и при этом сам ведёт себя как буйный сектант. «У кого что болит, тот о том и говорит» :)

htower_ ★★
()
Последнее исправление: htower_ (всего исправлений: 1)
Ответ на: комментарий от Siborgium

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

Оправдания любого обгадившегося трепла.

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

Ты совсем тупой, маня? Возможны две ситуации: пишется новый проект, дописывается текущий.

Берём первый случай - выбор говнораста и С++-20 - никак не отличаются. Т.е. для нового проекта эти две вещи однозначны. Если у кого-то есть потребность делать что-то на С++-98 - он будет это делать на нём. Ни на говнорасте, ни на С++-20. Здесь ты обделался.

Берём другой вариант. Существует код, он существует на С++/си. Если его никто не будет переписывать на С++-20, то никто не будет переписывать и на говнораст. Тут ты опять обделался.

Всё, никаких аутов у тебя нет. Ты в дерьме.

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

Ещё одна нелепая потуга балабола. Ты говорил это. Ты балаболил «никто не будет переписывать на новые кресты», а в другом случае болтал «на раст переписывают». Из этого прямо следует цитируемый тобою тезис, трепло.

Я лишь сказал, что существуют успешные проекты на расте.

Их нет, ты обделался. ТЫ обязан их показать - побежал показывать.

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

Маня, ты действительно считаешь, что можешь меня на чём-то поймать? Я сильнее тебя несоразмерно. Все твои потуги - нелепый скулёж обгадившегося балабола.

Да нет, я как раз про программы говорил. И опять ты додумываешь за меня. Бинго!

Ну чего говорил - балаболь. Что следует из этого потйги?

Где пример кода-то? Дай хоть какую-то конкретику, ты одни лозунги кидаешь. Не говоря уже о том, что вывод типа возврата не очень сочетается с выведением типов по контексту и в целом не является чем-то хорошим, порождает класс ошибок.

Чего пример, трепло? Я тебе сказал и ты цитируешь тезис «нету вывода типа возврата». Что тебе тут непонятно? Приводить примеры отсутствия чего-то я не обязан - это невозможно.

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

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

Маня, я уже тебе сказал. Что бы ты не болтал - ты обречён. Сейчас ты своим блеянием нелепым сообщил, что говнораст говно и порождает ошибки. Бегом побежал оправдываться за это балабольство.

anonymous
()
Ответ на: комментарий от anonymous

Опять опозорился. Я не знаю как эту шизу комментировать. Про auto, шаблонные параметры и прочее эксперт не слышал? Про функции? Про указатели/ссылки? Про специализацию? Про массивы. Уровень нелепости потуг зашкаливает.

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

auto

Я не стал перечислять все типы внутри темелейтов. Да в C++14/17 можно писать auto в объявлении функции, что равносильно typename, можно писать auto в темплейте, что уже вводит новую семантику и объединяет все не-typename типы, это мало что меняет.

шаблонные параметры

УАУ! Шаблонные параметры! Конечно не слышал!

Про функции

Тоже не слышал.

Про специализацию

Ого, язычек поддерживает паттерн матчинг?

Про массивы

Это те которые указатель, как Си? А в темплейтах? Oh wait...

Иди что-то почитай на тему типов и значениях как типах.

Возможно вы имели ввиду: зависимые типы. О, конечно нет!

Нету ты там ничего такого. Ты опять опозорился. Утиная типизация - это просто названия для бедных и слабых. В реальности её там нет. Просто С++ генерирует все возможно комбинации типов/ytnbgjd.

Конечно! Ведь темплейты-то разворачиваются без инстанцирования, просто пишешь темплейт и компилятор проверят ВСЕ ВОЗМОЖНЫЕ КОМБИНАЦИИ. Именно так!

До куда? Какой исполнение? Срочно за парту.

Раскрытие темплейтов (инстанцирование).

О боже, ну давай трепло. Побежал показывать и обосновывать за стектрейс. Живо. Пример выше тебе дали.

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

Kuzy ★★★
()
Ответ на: комментарий от WatchCat

Т.е. мне надо понять виртуалку с определенной версией ОС, поставить туда нужные либы (mpi/hdf5/CUDA/etc. При этом версии должны соответствовать тому, что стоит на удалённой системе), затем конпелять, заливать полученный «блоб» и надеяться, что всё заработает? Можно, в принципе, но не слишком удобно, как мне кажется :)

htower_ ★★
()
Последнее исправление: htower_ (всего исправлений: 1)
Ответ на: комментарий от Kuzy

В общем, очередной нелепый балабол прибежал, обделался и начал нести херню.

можно писать auto в темплейте, что уже вводит новую семантику и объединяет все не-typename типы, это мало что меняет.

Т.е. на каждый свой обсёр трепло будет нести херню вида «не меняет»? Как так не меняет, ты балаболил про мало типов, а типов бесконечное кол-во. Ты обделался.

К тому же нести херню о том, что auto чего-то там не меняет. Маня, ты там болтал про про кругозор. Ну вот и почитай букварь. Узнай что такое лямбда, какие у неё свойства, что такое auto и что такое auto = []{}.

УАУ! Шаблонные параметры! Конечно не слышал!

Тоже не слышал.

Не слышал. Если слышал - чего о них не балаболил сразу?

Ого, язычек поддерживает паттерн матчинг?

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

Это те которые указатель, как Си? А в темплейтах? Oh wait…

Позорище, ты даже об этом не знаешь? https://godbolt.org/z/eUdGU_ - сиди над этим каждый раз, когда попытаешься нести херню в интернете. Авось не будешь таким позорищем.

Возможно вы имели ввиду: зависимые типы. О, конечно нет!

Зависимые маня. А теперь в школу.

Конечно! Ведь темплейты-то разворачиваются без инстанцирования, просто пишешь темплейт и компилятор проверят ВСЕ ВОЗМОЖНЫЕ КОМБИНАЦИИ. Именно так!

Нет, трепло. Ты что родил? T.f() - это никуда и никогда не разворачивается. А когда оно «разворачивается» - оно генерирует все возможные варианты. Возможные, маня, это не все. Трепло. Опять опозорился.

Пыхти, каким образом твоя херня нелепая следует из моих слов.

Раскрытие темплейтов (инстанцирование).

Трепло, это не ответ на мой вопрос.

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

Это не ответ трепло. Тебе нужно однозначно связать поведение и твои потуги. https://godbolt.org/z/gAPsXH - почему есть «стектрейс», а нету шаблонов?

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

Поэтому ошибка в методе в классе в методе в классе в методе - так и будет описываться. Точно так же как и шаблон.

anonymous
()
Ответ на: комментарий от anonymous

Т.е. на каждый свой обсёр трепло будет нести херню вида «не меняет»? Как так не меняет, ты балаболил про мало типов, а типов бесконечное кол-во. Ты обделался.
К тому же нести херню о том, что auto чего-то там не меняет. Маня, ты там болтал про про кругозор. Ну вот и почитай букварь. Узнай что такое лямбда, какие у неё свойства, что такое auto и что такое auto = []{}.

Еще раз типов ВНУТРИ темплейтов. typename - это тип внутри языка темплейтов.

Примеры его значений

int
float
S<int, float>
decltype([] {})
std::string
CustomType
Все что ты перечислил это typename.

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

Специализация это и есть паттерн матчинг.

add1 [] = []
add1 x : xs = (x + 1) : add1 xs
Тоже самое на плюсах

template <typename T>
struct id {
  using type = T;   
};

template <int V>
struct int_ : id<int_<V>> {};

struct Nil : id<Nil> {};

template <typename H, typename T>
struct S;

template <typename L>
struct add1 {};

template <>
struct add1<Nil> : id<Nil> {};

template <int V, typename Xs>
struct add1<S<int_<V>, Xs>> : id<typename S<int_<V + 1>, add1<Xs>>::type> {}; 

Очень изящный язык. И нет, я это не запускал. Мне лень ставить metashell.

Позорище, ты даже об этом не знаешь? https://godbolt.org/z/eUdGU_ - сиди над этим каждый раз, когда попытаешься нести херню в интернете. Авось не будешь таким позорищем.

Уау, я сравнил void* с void*. Крутой!

Нет, трепло. Ты что родил? T.f() - это никуда и никогда не разворачивается. А когда оно «разворачивается» - оно генерирует все возможные варианты. Возможные, маня, это не все. Трепло. Опять опозорился.
Пыхти, каким образом твоя херня нелепая следует из моих слов.

Честно говоря, я не очень понял, зачем ты мне пытаешься доказать что T.f() не инстанцируется, при условии что T это шаблонный параметр.

Трепло, это не ответ на мой вопрос.

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

Тебе нужно однозначно связать поведение и твои потуги. https://godbolt.org/z/gAPsXH - почему есть «стектрейс», а нету шаблонов?

Научись в логику. Из шаблонов следует стектрейс. Из стектрейса шаблоны не следуют. В тысячи языков есть стектрейсы, но нет шаблонов.

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

Поэтому ошибка в методе в классе в методе в классе в методе - так и будет описываться. Точно так же как и шаблон.

Кароче. Смотри. Вот тебе питон:


def a0(a, b):
    return a + b;

def a1(a, b):
    return a0(a, b);

def a2(a, b):
    return a1(a, b);

def a3(a, b):
    return a2(a, b);
    
a3("0", 0)

Вот это он высрал как рантайм ошибку типов:

  File "main.py", line 12, in a3                                                                                                                                       
    return a2(a, b);                                                                                                                                                   
  File "main.py", line 9, in a2                                                                                                                                        
    return a1(a, b);                                                                                                                                                   
  File "main.py", line 6, in a1                                                                                                                                        
    return a0(a, b);                                                                                                                                                   
  File "main.py", line 3, in a0                                                                                                                                        
    return a + b;                                                                                                                                                      
TypeError: Can't convert 'int' object to str implicitly 

Вот плюсовый код

template <typename A, typename B> auto a0(A a, B b) { return a + b; }
template <typename A, typename B> auto a1(A a, B b) { return a0(a, b); }
template <typename A, typename B> auto a2(A a, B b) { return a1(a, b); }
template <typename A, typename B> auto a3(A a, B b) { return a2(a, b); }

int main() {
    a3("0", 0.f);
    
    return 0;
}

Вот ошибка _компиляции_.

prog.cc:4:64: error: invalid operands to binary expression ('const char *' and 'float')
template <typename A, typename B> auto a0(A a, B b) { return a + b; }
                                                             ~ ^ ~
prog.cc:5:62: note: in instantiation of function template specialization 'a0<const char *, float>' requested here
template <typename A, typename B> auto a1(A a, B b) { return a0(a, b); }
                                                             ^
prog.cc:6:62: note: in instantiation of function template specialization 'a1<const char *, float>' requested here
template <typename A, typename B> auto a2(A a, B b) { return a1(a, b); }
                                                             ^
prog.cc:7:62: note: in instantiation of function template specialization 'a2<const char *, float>' requested here
template <typename A, typename B> auto a3(A a, B b) { return a2(a, b); }
                                                             ^
prog.cc:10:5: note: in instantiation of function template specialization 'a3<const char *, float>' requested here
    a3("0", 0.f);
    ^
1 error generated.

Можешь начинать рассказывать где тут, опциональный контекст, который можно отключить (и ничего не понять). Что это не стектрейс раскрытия темплейтов. Что половина сообщений это не ошибка (интересно с какой сторы стека начнем сообщения убирать, как «не ошибку»).

Я вообще не понимаю, зачем ты споришь. Концепты ведь ровно эту проблему и решают.

Kuzy ★★★
()
Последнее исправление: Kuzy (всего исправлений: 1)
Ответ на: комментарий от htower_

Нахрен «определённая версия ОС»? Версии либ, да, они важны, но не всегда, даже glibc можно с собой таскать. Разве что версия MPI важна, да и то мажорная версия.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от anonymous

Возможны две ситуации: пишется новый проект, дописывается текущий.

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

Берем ситуацию «дописывается текущий». Если проект на С++, то концепты можно добавить, потеряв совместимость со старыми компиляторами. А можно и не добавить, если в компании про С++20 и слыхом не слыхивали, все работают хорошо если с С++14. Можно добавить не везде, а только выборочно. Если проект на Rust, то трейты там уже были, дописывать их никуда не нужно.

Список проектов на Rust есть на официальной страничке и легко гуглится.

ы балаболил «никто не будет переписывать на новые кресты», а в другом случае болтал «на раст переписывают»

Твою ж мать. Приведи-ка мне прямые цитаты со ссылками на посты. Отсутствие этих цитат я сочту публичным признанием вида «Я, царь, не умею читать и спорю с оппонентами у себя в голове».

Вывод типа возврата

Я тебе еще раз повторяю, в Rust нет вывода типа возврата потому, что это является плохой практикой и плохо сочетается с другими фичами языка.

говнораст говно и порождает ошибки

Как раст может порождать ошибки выводом типа возврата, если в нем нет вывода типа возврата? Расскажи-ка поподробнее с этого момента.

Теперь перейдем к более ранним сообщениям.

сути шаблоны это такой динамически язык с реплом.

Ты споришь с этим же утверждением чуть выше. Прими уже таблетки.

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

Siborgium ★★★★★
()
Ответ на: комментарий от fsb4000

Дак в итоге, С++20 разрешил ваши претензии или нет?

Увы, это просто ужас-ужас-ужас, а не концепты. Сколько на них ни смотрю последний год, никак не могу понять, что они хотели этим сказать, зачем так намудрили?.. Вот тут некоторые любят часто поворчать, что код на растишке дескать тяжело им понять... Смешно, будто бы код с концептами C++20 понять проще! Причем человеку, который успел довольно плотно поработать с C++, эпизодически, но очень плотно. Мне кажется, что С++ становится только сложнее и сложнее, и тут у меня возникают невольные ассоциации с монстром ПЛ/1, а ведь тоже какой крутой язык был для своего времени!

dave ★★★★★
()

Да хватит уже мусолить про педараст, все уже решили что это «типа безопасный язык». /thread

bonta ★★★★★
()
Ответ на: комментарий от bonta

педараст

Не надо учиться плохому у Эдиков и Царей :)

htower_ ★★
()

А, сейчас еще одну штуку покажу:

// документация к third_party

// Выводит аргумент в stdout
template <typename T>
void foo(T&&)
// third_party.hpp

template <typename T>
void foo(T&& t) {
    std::cout << t;
}

// main.cpp

#include <third_party.hpp>

struct S{ int i; };

int main() {
    S s;
    foo(s);
    return 0;
}

Как мне, не заглядывая в third_party.hpp, скомпилировать без ошибок с первого раза?

Как мне, не заглядывая в third_party.hpp, догадаться, что там используется std::cout, а не, скажем, printf, и что мне нужно перегрузить соответствующий оператор?

В Haskell или Rust хватило бы сигнатуры.

Siborgium ★★★★★
()
Ответ на: комментарий от Kuzy

Еще раз типов ВНУТРИ темплейтов. typename - это тип внутри языка темплейтов.

Чего ты несёшь, поехавший. Чего внутри? Какое, нахрен, typename - если это вообще nttp. Это не типы. Срочно за букварь, позорище.

Все что ты перечислил это typename.

О боже, уровень нелепости потуг опять зашкаливает. Всё что я перечислил - это nttp. Не типы. Хотя судя по тому, что будет дальше - ты совсем лсное трепло.

Специализация это и есть паттерн матчинг.

Нет.

Тоже самое на плюсах

И чё ты высрал? Во-первых это не плюсы, во вторых на каких основаниях именно это говно? Почему все клоуны берут мусорный огрызок сахара и пытаются что-то там пыхтеть? Это даже не компилтайм-отрыжка.

Вот С++, трепло нелепое:

template<auto ... xs> using add1 = list<(xs + 1)...>;

Ой, твоё говно не смогло? Ну бывает.

Очень изящный язык. И нет, я это не запускал. Мне лень ставить metashell.

Язык сразу отделяет того, кто может и того кто не может. Ты не можешь - для тебя есть пхп и прочая скриптуха.

Уау, я сравнил void* с void*. Крутой!

Так, ну мне это надоело. На этом можно заканчивать - трепло расписалось в своей несостоятельности, полной. Оно не осилил распарсить предложенный пример и начало балаболить, вместо того что-бы пойти в школу.

Нет, маня. Там не сравнивается void * с void *. Там передаётся значение указателя в качестве nttp. А уже далее возвращается это значение, берётся от него деклтайп и оно сравнивается с void *.

Ты балаболил, что нельзя записать указатель. Я записал - оправдывайся. Оправдывайся и за указатель и за то, почему ты, трепло, не сходило в школу и не прочитало букварь по С++ до того как начать балаболить?

anonymous
()
Ответ на: комментарий от anonymous

Чего ты несёшь, поехавший. Чего внутри? Какое, нахрен, typename - если это вообще nttp. Это не типы. Срочно за букварь, позорище.

Осиль что-нибудь кроме плюсов. И, внезапно, с темплейтами все станет понятно. Не понимаю, как за столько сообщений ты не осили понять что я говорю о ТЕМПЛЕЙТАХ как о языке, уау, это чистый, динамический язык с явным eval.

Нет.

(:

И чё ты высрал? Во-первых это не плюсы, во вторых на каких основаниях именно это говно? Почему все клоуны берут мусорный огрызок сахара и пытаются что-то там пыхтеть? Это даже не компилтайм-отрыжка.

Вот С++, трепло нелепое:

Это не cons list. По этому сравнение было бы не верно. Да, ты можешь написать метафункцию которая етот твой list<auto...> переведет в cons list. Сорьк, но вместо того чтоб приплетать неведомые листы, которые еще нужно реализовать, я решил все таки привести полный код. Да, на темплейтах метапрограммировать мало смысла, когда есть constexpr и можно залифтить тип в значение, как это сделано в boost::hana, oh wait, там же вся терминология из хаскелля... И все равно неполучится написать банальных вещей вроде автоматической сериализации, без обмазывания структур макросами.

Ой, твоё говно не смогло? Ну бывает.

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

Так, ну мне это надоело. На этом можно заканчивать - трепло расписалось в своей несостоятельности, полной. Оно не осилил распарсить предложенный пример и начало балаболить, вместо того что-бы пойти в школу.

Ты зачем-то обернул void* в variable template, очень круто.

Нет, маня. Там не сравнивается void * с void *. Там передаётся значение указателя в качестве nttp. А уже далее возвращается это значение, берётся от него деклтайп и оно сравнивается с void *.

НЕВЕРОЯТНО. Теперь мы знаем, что царь знает про variable template! Молодец!

Ты балаболил, что нельзя записать указатель. Я записал - оправдывайся. Оправдывайся и за указатель и за то, почему ты, трепло, не сходило в школу и не прочитало букварь по С++ до того как начать балаболить?

ШТО? Я без понятия как ты это распарсил и я даже без понятия, что ты тут имеешь ввиду тут. Куда записать?

Алсо, как ты интересно пропустил половину моего сообщения.

Kuzy ★★★
()
Ответ на: комментарий от dave

Смешно, будто бы код с концептами C++20 понять проще!

Проще.

Причем человеку, который успел довольно плотно поработать с C++, эпизодически, но очень плотно.

ИМХО, тут нужно выбрать одно из двух: либо плотно, либо эпизодически.

Ваш плюсовый код где-нибудь в открытом доступе увидеть можно?

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

eao197 ★★★★★
()
Ответ на: комментарий от eao197

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

Поменьше пафоса, Евгений :) А то выглядит примерно как вежливый-царь-едишн.

htower_ ★★
()
Ответ на: комментарий от anonymous

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

Virtuos86 ★★★★★
()
Ответ на: комментарий от htower_

А то выглядит примерно как вежливый-царь-едишн.

В вежливости меня еще никто не обвинял.

А так суровая правда жизни: в разговорах все супер-пупер программисты, а как попадает реальный код на сопровождение, так хоть ценник в полтора-два раза повышай… :(

Да вот один из самых рьяных местных растоманов, RazrFalcon, уже многократно доказывал, что не смотря на годы работы с C++ у него владение плюсами где-то на уровне «пишу программы на Qt». Так что мнение RazrFalcon-а о возможностях C++ можно смело множить на ноль.

По поводу dave как программиста не ничего не известно, поэтому не знаю, какую поправку стоит использовать для его высказываний о C++.

eao197 ★★★★★
()
Ответ на: комментарий от WatchCat

Дрочить в присядку это переписывать код под очередную платформу.

А я разве к этому призывал? Вы меня с кем-то путаете :)

htower_ ★★
()
Ответ на: комментарий от eao197

В вежливости меня еще никто не обвинял.

Ну извините :)

Да вот один из самых рьяных местных растоманов, RazrFalcon, уже многократно доказывал, что не смотря на годы работы с C++ у него владение плюсами где-то на уровне «пишу программы на Qt». Так что мнение RazrFalcon-а о возможностях C++ можно смело множить на ноль.

Тут такое дело. Есть программисты, которые знают C++ хорошо, даже отлично, они пишут всякие там бусты и т.п. Яркий пример из прошлого - Александреску. Но вот «среднестатистическому» C++ программисту такой код читать капец как тяжело, а поддерживать - так и вообще невозможно. Плюсы дают слишком большой простор, поэтому одни генерят «хайлевел», а другие - говнокод, и при этом обе стороны считают друг друга м*даками :) Тот же Qt, по-моему, вполне себе пример достаточно хорошего и понятного кода, где с одной стороны нет упарывания шаблонами, а с другой - нет «заката солнца вручную», в стиле сишников. Крайности - это всегда плохо.

htower_ ★★
()
Ответ на: комментарий от htower_

А я говорил, что кто-то к чему-то призывал? Я говорил вот про это:

Я недавно «откатывал» свой код до C++11 варианта,

WatchCat ★★★★★
()
Ответ на: комментарий от htower_

Не, мой посыл несколько в другом. Это другое из двух частей состоит:

  1. Хорошо бы понимать, что из себя собеседник представляет как программист. Потому что одно дело трепаться на форумах, другое – писать код. И случаев, когда на словах все гладко, а в коде, тупо вручную написанная сортировка пузырьком просто потому, что программист ничего не знает про стандартную библиотеку (реальный случай, кстати) не мало, к сожалению.

  2. Язык программирования – это инструмент. Инструментом хорошо бы владеть. Ну или, по крайней мере, иметь представление о его возможностях. Соответственно, если кто-то надевает на себя шапочку «среднестатического» программиста и довольствуется неким подмножеством C++ (тем же С++ из Qt), но при этом позволяет себе поносить остальные возможности языка (типа исключения – это плохо, а шаблоны – это говно), то это выглядит странно. А говорящий такие вещи выглядит неадекватно.

Ну понятно, что кому-то достаточно определенного подмножества. Ну Ok. Это нормально.

Ненормально когда вещи вне этого комфортного подмножества для «среднестатического» программиста предаются анафеме, высмеиваются и т.д.

eao197 ★★★★★
()
Ответ на: комментарий от WatchCat

Я недавно «откатывал» свой код до C++11 варианта

А, вы про это. Ну да, налетел немного :) В итоге пришел к выводу, что писать нужно на c++11, так проще будет в моём случае. В 17-м стандарте добавили некоторые «вкусности», но, к сожалению, много выч. систем «из коробки» тянет только 11-ю версию.

htower_ ★★
()
Ответ на: комментарий от htower_

плюсы дают слишком большой простор, поэтому одни генерят «хайлевел», а другие - говнокод, и при этом обе стороны считают друг друга м*даками :)

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

Serral
()
Ответ на: комментарий от eao197

у него владение плюсами где-то на уровне «пишу программы на Qt»

Так это проблема языка, а не моя.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

C++ сейчас в роли догоняющего

Да ладно, вчера ради интереса решил посмотреть на функторы в Rust, и, правильно, они в unstable. Как и многое другое, что уже есть в С++. Причем далеко не все есть даже в unstable.

Serral
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.