Для if(x>0) y; else z; возвращаемый тип это тип-сумма typeof(y) + typeof(z)
кстати, тоже об этом подумал пока читал статью, но сейчас задумался - а бывает ли необходимость в типее произведении typeof(y) * typeof(z)? И что этот тип вообще из себя представляет… Сумма то понятно, уже много где есть, а вот произведение или другие операции нигде не видел чтобы применяли в системе типов.
Но статья не о том, что шаблоны опасны сами по себе, но что вывод типов через шаблон меняет, как читается const T& и разработчик перестаёт держать в голове вопрос “а что мне реально прилетело”.
мне кажется или как раз с const& шаблон ничего не меняет? Тут мне всегда прилетает константная ссылка. А что там в объекте за mutable и const_cast - это его проблемы. Он должен сам свои инварианты соблюдать.
А вот с T& вы правы. Не совсем очевидно что тут может прилететь константная ссылка. Но, с другой стороны, - это имеет какое-то значение? Кроме как для чтения кода. Ведь если кто-то передаст const int&, то код просто не скомпилируется (если и правда обращается к неконстантным методам).
Простой ответ - любая машина никогда не будет знать все об окружающем мире, контекст, допущения конкретно вашей задачи или запроса. Без этого никогда не будет экспертности в проекте или части кода.
Кажется тут просто логическая ошибка. Переведем на людей:
любая человек никогда не будет знать все об окружающем мире
Без этого никогда не будет экспертности в проекте или части кода
=> вывод: не существует людей с окспертностью в проекте… Вывод, очевидно ложный. В реальности это неправда.
по-моему вы упускаете тот же самый момент что и автор статьи:
Проблема всё равно остаётся: откуда берётся эта точная спецификация
Во-первых, спецификация и есть по сути код.
Во-вторых - а откуда она берется сейчас? Правильно, постановщик задачи дает его представление о требуемом результате, а задача современного разработчика это представление привести к спецификации. Для этого есть разные способы - логические заключения, уточняющие вопросы и тд.
Т.е., то что вы упускаете - почему этим “современным разработчиком” должен быть человек? Что мешает следующему или N-ому клоду быть достаточно сообразительным чтобы заниматься этим? Правильно - ничего.
P.S. хотя похоже иммено это и пытается сказать @amazingname, пусть и в не очень сдержанной манере.
А быстрый разработчик просто делает меньше. Где-то захардкодит, где-то закостылит, где-то вынесет в конфиг, где-то вообще ничего не сделает. Вот такая профессиональная лень - это уже навык, который плохо проверяется на собеседовании, но очень хорошо виден через месяц другой работы на проекте.
знаем мы эту профессиональную лень. Через 5 лет этих разработчиков уже и след простыл, а тебе разгребать.
Важное уточнение - вместе с навыком профессиональной лени идет навык профессиональная бдительность. Важно не проморгать момент, когда эта “упрощенная” модель, которая работала тогда, начинает расти во что-то серьезное, чтобы успеть переписать еще пока небольшую систему в что-то сносное и расширяемое, чтобы не получился монстр…
Но если ivan попробует прочитать файл – получит Permission denied. Почему? Ядро проверило: EUID процесса совпадает с UID файла – совпадение на шаге 2. Применило биты owner – —. Остановилось. Биты group rwx даже не рассматривались. ivan является владельцем, но у владельца нет прав. Группа имеет полный доступ – но до неё проверка не дошла.
Решение – дать владельцу права явно:
какое ж это решение…
В целом было бы хорошо объяснить зачем и почему и для чего нужны группы. В моем (чисто интуитивном) представлении это нужно чтобы давать какой-то группе пользователей определенные права - например доступ к файлам. Ведь намного проще добавить пользователя в группу/удалить из группы чем менять права везде.
Оказывается все не так просто… Было бы интересно узнать какое решение правильное. Либо для чего нужны группы тогда…
С чего вы взяли что подсознательно это работает через оценку обоих вредов и сравнение?
зачем это сравнение формализовывать? Мой первый же коммент про то что необязателльно это специфицировать/формализовывать чтобы оно работало. Думаете кто-то в моей голове это формализовал? пока я спал, разве что)
не думаю что это была причина такого дизайна. Скорее тогда не придумали ничего лучше. Были тогда уже языки, которые делали вывод через форматную строку вроде print(“Hello, {}!”, “World”) ? - не уверен.
Думаю тут ещё сыграло то что тогда не было возможностей для compile-time разбора форматной строки. Предложу что главной целью стримов было уйти от printf чтобы обеспечить безопасный вывод.
не понимаю вас, изложите ваши мысли яснее, пожалуйста.
Я, как человек (надеюсь), легко могу ответить что на ваши что на вопросы @konst90 выше. И для этого мне все еще не нужна спецификация ни вреда ни человека
Если бы люди считали химиотерапию вредом, то использовали бы ее повсеместно?
Про человека с ножом и того бесполезнее. Думаю, большинство людей в опросе сделают выбор защитить. И это именно то поведение которое мы ждем от робота.
Весь азимов - это то, как три простых правила совершенно никак не помогают. В частности потому, что нельзя оценить и специфицировать такие части этих правил, как “что такое вред” и “что такое человек”.
Эти понятия необязателльно специфицировать, чтобы они начали работать. Я вот с трудом дам определение этим терминами (и ему найдется куча контрпримеров), но зато могу отлично оценивать на примере кто/что является человеком и что является вредом, а что нет.
Допускаю что такую особенность возможно реализовать не только в человеком мозге. Вон, LLM и сейчас неплохо это делают. И не нужна им никакая “спецификация”
То же могу сказать и про относительно свежие range.
да, ренжи могут выглядеть страшно, и дебажить их тяжело. Но как сделать композитные алгоритмы лучше? Думаю, пока дело не доходит до всяких transform и сложных filter, они очень даже удобны - например ппробежаться по контейнеру с индексами, или попарно, или пройтись только по ключам/значениям. Без ренжей для этого приходилось возвращаться к старому сишному циклу. Теперь это намного более читаемо
Гугола это google? который купил, а потом закрыл (ну тут вернул)
интересно было бы посмотреть на ваш язык.
кстати, тоже об этом подумал пока читал статью, но сейчас задумался - а бывает ли необходимость в типее произведении typeof(y) * typeof(z)? И что этот тип вообще из себя представляет… Сумма то понятно, уже много где есть, а вот произведение или другие операции нигде не видел чтобы применяли в системе типов.
мне кажется или как раз с
const&шаблон ничего не меняет? Тут мне всегда прилетает константная ссылка. А что там в объекте заmutableиconst_cast- это его проблемы. Он должен сам свои инварианты соблюдать.А вот с
T&вы правы. Не совсем очевидно что тут может прилететь константная ссылка. Но, с другой стороны, - это имеет какое-то значение? Кроме как для чтения кода. Ведь если кто-то передастconst int&, то код просто не скомпилируется (если и правда обращается к неконстантным методам).Кажется тут просто логическая ошибка. Переведем на людей:
любая человек никогда не будет знать все об окружающем мире
Без этого никогда не будет экспертности в проекте или части кода
=> вывод: не существует людей с окспертностью в проекте… Вывод, очевидно ложный. В реальности это неправда.
по-моему вы упускаете тот же самый момент что и автор статьи:
Во-первых, спецификация и есть по сути код.
Во-вторых - а откуда она берется сейчас? Правильно, постановщик задачи дает его представление о требуемом результате, а задача современного разработчика это представление привести к спецификации. Для этого есть разные способы - логические заключения, уточняющие вопросы и тд.
Т.е., то что вы упускаете - почему этим “современным разработчиком” должен быть человек? Что мешает следующему или N-ому клоду быть достаточно сообразительным чтобы заниматься этим? Правильно - ничего.
P.S. хотя похоже иммено это и пытается сказать @amazingname, пусть и в не очень сдержанной манере.
знаем мы эту профессиональную лень. Через 5 лет этих разработчиков уже и след простыл, а тебе разгребать.
Важное уточнение - вместе с навыком профессиональной лени идет навык профессиональная бдительность. Важно не проморгать момент, когда эта “упрощенная” модель, которая работала тогда, начинает расти во что-то серьезное, чтобы успеть переписать еще пока небольшую систему в что-то сносное и расширяемое, чтобы не получился монстр…
какое ж это решение…
В целом было бы хорошо объяснить зачем и почему и для чего нужны группы. В моем (чисто интуитивном) представлении это нужно чтобы давать какой-то группе пользователей определенные права - например доступ к файлам. Ведь намного проще добавить пользователя в группу/удалить из группы чем менять права везде.
Оказывается все не так просто… Было бы интересно узнать какое решение правильное. Либо для чего нужны группы тогда…
так и не понял, что мешает появиться в нашей вселенной разуму, но на планете которая вообще не попадает на ось зла…
почему? разве пересечение оси зла с солнечной системой это обязательное условие для зарождение жизни там?
а что из этого следует? насколько я понял, шанс этого явление крайне мал. Прочерчена или нет, вы считаете это случайностью?
и, к сожалению, лгали. Сравнивать float с целыми числами вполне можно. Вот, даже статейку недавно постили неплохую - https://news.ycombinator.com/item?id=47767398
P.S. каюсь, увидел что написано “результат операции”. Но статейка все равно полезная)
не знаю почему вы не можете услышать мою мысль…
С чего вы взяли что подсознательно это работает через оценку обоих вредов и сравнение?
зачем это сравнение формализовывать? Мой первый же коммент про то что необязателльно это специфицировать/формализовывать чтобы оно работало. Думаете кто-то в моей голове это формализовал? пока я спал, разве что)
не думаю что это была причина такого дизайна. Скорее тогда не придумали ничего лучше. Были тогда уже языки, которые делали вывод через форматную строку вроде print(“Hello, {}!”, “World”) ? - не уверен.
Думаю тут ещё сыграло то что тогда не было возможностей для compile-time разбора форматной строки. Предложу что главной целью стримов было уйти от printf чтобы обеспечить безопасный вывод.
причем здесь сравнение количества вреда…
я не сравниваю в голове количество когда думаю про химиотерапию или нападающего с ножом - чаще всего на уровне интуицию понимаю правильный ответ.
не понимаю вас, изложите ваши мысли яснее, пожалуйста.
Я, как человек (надеюсь), легко могу ответить что на ваши что на вопросы @konst90 выше. И для этого мне все еще не нужна спецификация ни вреда ни человека
Не понимаю к чему тут ваши примеры.
Если бы люди считали химиотерапию вредом, то использовали бы ее повсеместно?
Про человека с ножом и того бесполезнее. Думаю, большинство людей в опросе сделают выбор защитить. И это именно то поведение которое мы ждем от робота.
зависимости это не часть приложения.
Зависимости это дополнительный функционал, который приложение использует. И они не обязательно производятся/поставляются вместе с приложением.
Зависимости являются частью приложения только если их нет)
Эти понятия необязателльно специфицировать, чтобы они начали работать. Я вот с трудом дам определение этим терминами (и ему найдется куча контрпримеров), но зато могу отлично оценивать на примере кто/что является человеком и что является вредом, а что нет.
Допускаю что такую особенность возможно реализовать не только в человеком мозге. Вон, LLM и сейчас неплохо это делают. И не нужна им никакая “спецификация”
не знаю как надо было это читать, чтобы сделать такой вывод… по-моему там очевидна метафора души как крови, а не прямое сопоставление
не пойму, что именно там “ради C++”.
да, ренжи могут выглядеть страшно, и дебажить их тяжело. Но как сделать композитные алгоритмы лучше? Думаю, пока дело не доходит до всяких transform и сложных filter, они очень даже удобны - например ппробежаться по контейнеру с индексами, или попарно, или пройтись только по ключам/значениям. Без ренжей для этого приходилось возвращаться к старому сишному циклу. Теперь это намного более читаемо