паясничать перестаньте, лучше "полезно" проясните.
Да не, почему, я ж не спорю, ненужная на практике фигня. Точно так же, как и тесты — ненужная на практике фигня (с чем спорите уже вы).
чувак написал: "полезно" и выдал такую хрень, что без поллитры никто не разберёт, которая на экране не помещается!
Показал ради лулзов основания математики на расте, чем плохо? Это как судить об ООП по fizzbuzz enterprise edition (только, в отличие от ООП, математика интересна и полезна).
понятно почему вас на работу не нанимают.
Почему? Нанимают же. Я прям сразу говорю, что не пишу тесты, и мне сразу оффер дают на ×2 от верхней границы вилки.
и программировать чередование чисел, не важно натуральных, фибоначчи, факториалов или ещё чего, ни в энтерпрайзе не требуется ни в не энтерпрайзе.
При этом вы топите за тесты и ООП, хотя никто не видел никакого правильного ООП, и тесты нафиг не нужны ни энтерпрайзу, ни его пользователям. Плюс, все эти тесты тестируют 2+2 = 4, очень классно.
Вы таки будете смеяться, но в HEB, крупнейшем техасском (и одном из крупнейших американских) продуктовом ритейлере
As of 2022, the company had a total revenue of US$38.9 billion.[8] H-E-B ranked number 6 on Forbes' 2022 list of "America's Largest Private Companies".[9] The company also ranked number 3 on Forbes' 2024 list of "Customer Experience All-Stars."[10] H-E-B was named Retailer of the Year in 2010 by Progressive Grocer.[11] Supermarket News ranks H-E-B 13th on the list of "Top 75 North American Food Retailers" by sales.[12] Based on 2019 revenues, H-E-B is the 19th-largest retailer in the United States.
Если про меня, я не жаловался на неясность trait'ов.
Неявность. НеяВность. Вы же рядом:
Rust, из-за наличия trait'ов и макросов может скрывать реализации алгоритмов, что для программистов на C не приемлемо.
И автомагию я не прелагал.
Вы это сделали только что, предложив компилятору автоматически делать move в зависимости от нетривиальных условий. В том числе, тихо и без предупреждений ломать код
std::string s { "я не могу общаться с ретардами, но приходится" };
doSmth(foo);
return s[0];
при изменении другой перегрузки. Это напрочь ломает всю идею типизации (обеспечение гарантий компилятором), когда наличие (и последующее удаление) doSmth(const std::string&)означает, что вы хотите именно копировать (или перемещать, неважно, но одно из поведений должно бытья вным) и потом перестать это делать.
Иными словами, если я удаляю эту перегрузку, то я хочу, чтобы компилятор меня ткнул носом в те места, где я на неё опирался, чтобы я подумал, что с этим делать (заменить на мув, переписать алгоритм, вернуть перегрузку). Если вы хотите, чтобы происходило что-нибудь, лишь бы происходило — пишите на джаваскрипте. Это ровно ваш [object Object], так что непонятно, зачем вы undefined is not a function.
Вы себе какой-то ошибочный образ в голове построили и пытаетесь с ним дискутировать. Мой вам совет. Выйдите на улицу, Подышите. Вам явно что-то мерещиться.
Перед тем, как раздавать советы, попробуйте научиться читать и не путать буквы, а затем — помнить, что вы же писали меньше суток назад. Задача со звёздочкой — продумывать, к чему приводят ваши предложения.
При наличии только одной функции с аргументом типом универсальной ссылки, перемещение могло выполняться автоматически.
то что вы здесь будете копировать или перемещать в вызове, где оба аргумента не rvalue?
А если я не хочу перемещать, в конце концов, то что мне делать? Сделаете std::dontmove?
Предложения «ну давайте мувать автоматически, и копировать тоже автоматически, и вообще» может выдавать только человек, который не писал ничего сложнее хелловорлдов, и с std::move знаком по постам в блогах OTUS.
На уровне компилятора можно было добавить интринсинк, чтобы не использовать стандартную библиотеку.
Ура, наконец-то человек, с которым достоверно можно поговорить по существу!
либо заниматься выпасом котов, которые будут работать над этими обвязками.
Зачем этим выпасом заниматься? Они уже сами предложили свою помощь и кандидатуру.
У С есть одно неоспоримое приемущество перед Rust - этот язык, в целом, мёртв.
Что имеет некоторые последствия, к слову, по части привлечения новых разработчиков (Кристоф, к сожалению или к счастью, не вечен).
Шансов, что кто-то там что-то сделает deprecated, почти нет.
Ну как тебе сказать…
Кстати, отдельный лайк за то, чтобы defined-поведение делать undefined. Такого настолько явного в настолько тривиальном коде я даже в плюсах не припомню сходу.
Да, инструмент устарел на целую жизнь при этом, но зато никто не будет капать на мозг, что в этом сезоне мы код оформляем так, а кто не так, тот лох.
Я в очередной раз напомню, что девиз ядра для ядерных вещей — stable API is nonsense.
Вы проигнорировали некоторые мои вопросы, среди которых:
Вы можете указать конкретный сценарий возникновения проблем, когда копипаста байндингов в драйвера даёт преимущество по сравнению с их централизацией в одной папочке (не обязательной для сборки ядра настолько же, насколько необязательны драйвера)?
Где написано, что у Кристофа есть помощники-мейнтейнеры?
Какие гарантии по времени отзыва даёт Кристоф и другие мейнтейнеры?
Является ли принятое решение в ядре высеченным в граните на века?
На каком языке написаны блобы прошивок, и как это мешает разработке?
так что я теперь буду в начале комментария их повторять и пополнять этот список.
Это неудобно в конкретной кодовой базе.
Я на всякий случай отмечу, что причина не становится технической от количества повторений, а конкретные сценарии вы так и не указали.
Этого было достаточно для отказа. Не можете с этим смириться - это ваши личные проблемы.
Достаточность этого для отказа в конкретном проекте просто показывает, что он окончательно скатился в клоунаду. Зачем по этому поводу испытывать вообще хоть какие-то эмоции, с которыми нужно было бы смиряться?
Сложно ему или сложно в принципе?
Сложно ему, очевидно. Или он у нас теперь демократически избранный лидер всех программистов, говорящий от их лица?
Он указывал не лично себя.
Ваша же цитата:
Maintaining multi-language projects is a pain I have no interest in dealing with.
(курсив мой)
Если я сейчас напишу «maintaining C projects is a pain I have no interest in dealing with», то это станет непреложной истиной по одному факту того, что я так написал?
Кристоф дал разъяснения
«Мне сложна но помощь не нужна»
и альтернативы
«Копипастите везде»
Вы не можете быть настолько непроходимо глупым, чтобы считать это альтернативой. Вы троллите.
Пользы в крупных проектах от Rust пока не видно, чтобы так громко заявлять.
— Польза от раста не показана. — Результаты гугла по использованию раста в AOSP говорят об обратном. — Nim и Zig тоже где-то используют, и что? — Не в крупных проектах уровня AOSP или не в крупно-ответственных проектах уровня проксей клаудфлары. — Польза раста в крупных проектах не показана.
Вы не уважаете собеседников, тролля их глупостью, поэтому я не буду уважать вас и спрошу прямо: вы идиот? Вы не можете поддерживать контекст больше, чем на 10 минут или две реплики? Или какая вообще может быть причина человеку высказывать нечётные реплики в диалоге выше?
проблема в том, что в подавляющем большинстве случаев это будет возврат указателя на объект стека
V не обязан быть на стеке. В какой момент на стеке оказывается шаблонный аргумент здесь?
template<int V>
auto foo() { ... }
foo<42>();
Я бы хотел посмотреть на ваш "иногда корректна" сценарий, потому что для меня это или говнокод с UB или без UB.
Я не помню точную формулировку в стандарте, но это UB с типами вроде intов и не UB с class non-type template parameters'ами (что и является C++20-фичей, и что вообще оправдывает существование этой функции — лично мне такое было нужно ровно для class NTTP).
Например, этот код компилируется (что означает, что там нет UB), а если раскомментировать, то нет:
Не только в нём, а во множестве дополнительных элементов, которые являются частью стандартной библиотеки enable_if_t один из них. И для того, чтобы использовать их либо нужно использовать стандартную библиотеку
Ещё раз, sfinae плохо потому, что оно использует enable_if, который является частью стандартной библиотеки, которую надо нести целиком или реализовывать с нуля? Я правильно понял вашу «логическую» цепочку?
либо нести реализации с собой в код.
Ничего страшного, с кусками сишной библиотеки так и сделали.
С языком C со скрипом переходили на новый стандарт.
Кстати, интересно, зачем.
А тут вы прелагаете сразу с двух ног войди в C++20, который не во всех компаниях ещё используют.
Не во всех компаниях и C используют, и?
В ядро, где очень ревностно относятся к нововведениям
Ну вы ж сами показали, что C++20 полезнее и удобнее, чем, скажем, 17.
Тем, что должно быть явно вызвано.
А откуда компилятору знать, хотите вы тут явный мув или нет? Когда сможете в общем случае определять, нужно ли тут:
void sink(const MyObject&);
void sink(MyObject&&);
// ...
MyObject obj;
if (foo()) {
sink(obj); // вот здеся move?
}
if (bar()) {
otherSink(obj);
}
вызывать move или нет, расскажите, мне пожалуйста. А то я могу к этому свести проблему останова, мы с вами вместе опубликуем эпохальную статью, и вы увековечите своё имя. Идёт?
А когда неоднозначностей нет, то std::move вызывать не надо (например, implicit move в return, когда (N)RVO не срабатывает).
Даже если передаётся, как аргумент с типом универсальной ссылки.
Необязательность move в таких случаях делает код куда более чувствительным к рефакторингу, когда добавляется перегрузка функции, и код по-тихому ломается (давая худший перф на ровном месте).
Человек, который в одном комментарии жалуется на неявность трейтов раста и опасливость к изменениям, а в другом предлагающий подобную хрупкую автомагию — это, конечно, смешно.
И в примере вы забыли remove_reference_t развернуть, так как без него работать не будет. Это тоже часть стандартной библиотеки.
Когда говорят, что «X — однострочник», подразумевают, что остальные части языка всё ещё доступны. «X — однострочник на баше» не означает, что весь баш реализуется в одну строчку, или что используемые команды реализуются в одну строчку.
Вы проигнорировали некоторые мои вопросы, среди которых:
Вы можете указать конкретный сценарий возникновения проблем, когда копипаста байндингов в драйвера даёт преимущество по сравнению с их централизацией в одной папочке (не обязательной для сборки ядра настолько же, насколько необязательны драйвера)?
Где написано, что у Кристофа есть помощники-мейнтейнеры?
Какие гарантии по времени отзыва даёт Кристоф и другие мейнтейнеры?
Является ли принятое решение в ядре высеченным в граните на века?
На каком языке написаны блобы прошивок, и как это мешает разработке?
так что я теперь буду в начале комментария их повторять и пополнять этот список.
Технические причины были указаны - удобство сопровождения.
Это станет техническими причинами тогда, когда будут указаны конкретные сценарии, при которых что-то будет неудобно. Потому что программистский фольклор и общий опыт показывает, что так, как предлагают растаманы, таки удобнее.
Про сложность Кристов не писал.
Писал, мол, что двуязычные кодовые базы сложно поддерживать.
Никто не критиковал вклад Гектора в код ядра.
Я не писал про критику. Вы отвечаете на какие-то собственные голоса в голове.
Кристоф дал альтернативное предложение
Которое осмысленно настолько же, насколько осмысленно предложение написать собственный форматтер кода для C++ вместо использования существующих, а иначе решить (и высечь на камне), что стиля кода нет никакого.
Он лишь написал, что «вера у него кончилась» (это цитата).
Это норм. Мы все во что-то верим — в благонамеренность тех, с кем взаимодействуем, как пример.
А они там должны быть?
Для того, чтобы это было ответом на моё «раст показывает свою пользу в крупных проектах» — да.
Ясно, понятно.
Не уверен, что вам что-либо ясно, потому что вы до сих пор воспринимаете предложение копипастить как адекватное контрпредложение.
И вы не указали, опять же, конкретные сценарии, показывающие профиты копипасты (что заставило меня добавить этот вопрос в список проигнорированных вами).
Безошибочный подбор правильных реализаций. Для того, чтобы избавиться от ошибочного подбора нужно строить много дополнительного не всегда очевидного с точки зрения понимания кода.
Что непонятно в enable_if_t?
Концепты исправляют ситуацию, но они в C++20.
Повод сразу использовать C++20!
Вы могли нормальный вопрос задать с самого начала, или, если вы знали, могли бы сразу дать на него ответ.
Мог, но имею право выражать их в форме риторических вопросов. А вы, если бы хотели донести свою точку зрения, могли бы ответить и на вопрос в такой форме.
Не однострочники. move как миниму на три строки. так как нужно избавиться от ссылочности перед этим.
Вы проигнорировали некоторые мои вопросы, среди которых:
Где написано, что у Кристофа есть помощники-мейнтейнеры?
Какие гарантии по времени отзыва даёт Кристоф и другие мейнтейнеры?
Является ли принятое решение в ядре высеченным в граните на века?
На каком языке написаны блобы прошивок, и как это мешает разработке?
так что я теперь буду в начале комментария их повторять и пополнять этот список.
А в чем неадекватность отказа со стороны Кристофа?
Например, в отсутствии технических причин? В предложении копипасты? В «мне сложно, но мне не нужны помощники»?
Неадекватными пока что только выглядят адепты Rust. Особенно Гектор Мартин.
Ух мерзавец какой неадекватный. Ему сказали, что результатам его труда тут не рады, и ему нужно сделать тройной тулуп с переворотом и сплясать, а он, инфантильный эмоционал, отказался тулупиться и плясать, а просто пошёл по своим делам. Ужас!
Который ушёл из мейнтейнеров из-за обиды на слова Торвальдса. Опять же чисто эмоциональный поступок. Не прагматика движет, а эмоции. Возможно даже инфантилизм.
Опять базарнобабковый дискурс пошёл.
Он это где-то написал, про обиду, про это всё? Или вы сами придумали?
Так и на Zig сейчас проекты пишут. На Nim, Odin. (любой другой новый красивый язык)
Сколько кода на Zig, Nim и Odin в AOSP? Сколько кода на Zig, Nim и Odin в клаудфларовских проксях?
Вы серьёзно не понимаете разницы, или просто упражняетесь в демагогии?
А зачем делать на каждый драйвер? Достаточно на несколько.
На каждый растовский драйвер, очевидно. Потому что без этих обвязок его невозможно написать.
Объяснить, доказать верность замены. Можно попробовать так пойти.
У этой лишней работы снова нет никаких технических причин.
Вы можете указать конкретный сценарий возникновения проблем, когда копипаста байндингов в драйвера даёт преимущество по сравнению с их централизацией в одной папочке (не обязательной для сборки ядра настолько же, насколько необязательны драйвера)?
Например, по личным причинам — ну не нравится Торвальдсу язык, и всё тут. Или по легаси-причинам — просто потому, что в 91-м году с компиляторами и стандартом C++ было всё очень плохо.
И шаблоны отчасти были тому причиной.
Так в чём конкретно проблема со sfinae, можете сказать? Особенно чтоб в C++11 она усугубилась, как вы изначально говорили.
Сами задали выпрос. Если вещи очевидны, к чему тогда сам вопрос был.
Этот вопрос — риторический, и является ответом на ваш псевдоаргумент. Собственно, вопрос к этому ответу, и вы так и не пояснили, в чём конкретно проблемы.
Никак. В C нет семантики перемещения.
Всегда копируют, что ли? Ну вот заодно перемещать научатся. Видите, одни плюсы!
И вы можете запретить их добавлять? Не можете.
Не понял, почему не могу? Не принимаю патч, который добавляет что-то, точно так же, как не приму патч, который сегодня добавляет thrd_create.
Без костылей в виде std::move или std::forward из стандартной библиотеки семантика перемещения не работает.
Это вообще однострочники, их самому можно написать, в чём костыльность и в чём проблема?
Помимо ни есть ещё целая куча вещей.
Вы упорно избегаете конкретики, просто размахивая руками и высказывая общие тезисы.
Нет, конечно. Достаточно дать им мейнтейнить соответствующую субдиректорию, и нет никаких проблем.
Он как мейнтейнер всей подсистемы отказал в патче считая, что это навредит сопровождению. Он имеет право на это.
Он имеет право даже отказать в патче, у которого первый символ каждой строки, начиная с 17-й, не складывается в фразу "c{hristoph is the greatest man on earth}". Вопрос в адекватности этих отказов, и мы обсуждаем именно его.
Он готов принять отдельный код на каждый драйвер, о чём написал, но не на всю систему в целом.
Исключительно потому, что отдельный код на каждый драйвер никто не будет делать, и он это понимает.
Это уже не важно. Ситуация уже произошла. Решение уже принято.
Высечено в граните прям?
Красивые лозунги в новостях многие умеют писать. Это ещё ничего не говорит.
Там кроме лозунгов ещё есть отчёты по дырявости кодовой базы на сях и плюсах и кодовой базы на расте в андроиде, например. И есть конкретные работающие продукты, которые выбрано делать на расте. Но это всё, конечно, мелочи и лозунги.
Они прописаны в списке мейнтейнеров.
Покажите, где в списке мейнтейнеров указано, что они конкретно помощники Кристофа.
Кристофу инкриминируют по сути неприязнь языка Rust.
Ну либо это, либо он царёк с ЧСВ, тут выбора нет.
В то время как сам Кристов писал, что у него нет негатива против языка.
Человек в одном комментарии пишет по смыслу «красивые лозунги мноиге умеют писать, поэтому неважно, что говорят» и «ну раз человек что-то написал, то это должно быть правдой, буду исходить из этого».
Спасибо вам за дискуссию, вы даёте повод орать в голосину просто в каждом комментарии.
А вас, как мне кажется, что-то задевает. Ведь Rust'у отказали, какая же несправедливость.
Про своё отношение к расту я уже писал. В данном же случае меня задевает только непроходимая, фанатичная глупость некоторых персонажей, защищающих такие решения и всерьёз предлагающих копипастить код для улучшения его поддерживаемости, или очень избирательно применяющих аргументы уровня «технология может быть опасной, она не всегда приводит к тому, что хочется». Но это скорее даже не задевание, а персональный челлендж такой — получится ли что-то донести человеку, который даже осилил открыть браузер и набрать там эйч эй би ар дот ком <enter>, поэтому обладает, наверное, какими-то когнитивными способностями, или не.
— всё предельно явно, грепабельно и типобезопасно (насколько это может быть безопасно для языков C-семейства).
И линтер действительно ругнётся, например, clang-tidy:
note: Object 'foo' is moved
37 | doSmthWithFoo(std::move(foo));
| ^~~~~~~~~~~~~~
note: Method called on moved-from object 'foo'
39 | foo.bar();
| ^~~~~~~~~
Хотите сказать, что нет? Вы прям можете запретить не вызывать отдельные инклюды?
Да, конечно. Например, не имея этих инклюдов в путях компилятора в процессе сборки.
А что, запрещено документально?
Лол. Lmao even. В который раз убеждаюсь, что самые ярые фанаты сишки нихрена не знают о C, а самые ярые фанаты штабильности в ядре нихрена не знают ни о конкретном обсуждаемом ядре. Кекспертиза уровня опеннета.
А такого нет в C++, либо вся библиотека в целом, либо своя собственная реализация на месте.
Кто сказал?
Напомню, кстати, что ядро написано не на стандартном C, а на диалекте. Апеллировать к отсутствию каких-то ограничений в стандарте плюсов — это снова интеллектуальная нечестность.
А я что-то не помню, чтобы для C запрещали использовать что-то из стандартной библиотеки.
А исключение здесь где? То, что помощники могут помочь ещё не означает, что они нужны.
Если человек не может выполнять работу сам, значит, нужны.
В ту же логику можно принести - зачем усложнять там, где усложнения не требуется.
Если не требуется. А переход на rust — это вполне себе полезное изменение.
Так вы оригиналы посмотрите, чтобы не терять смысл заявлений. И для более детальной картины всех заявлений Кристофа. Потому что переводы не верны, а дёргать отдельные выражения без контекста - портить суть его слов и своего лично понимания.
Окей, покажите, где что выкинуто из контекста, и где переводы неверны. С отсылкой к оригиналу, конечно.
Так и Кристов не драйверы пишет. Он сопровождает одну из критических подсистем ядра.
А будет сопровождать вместе с кем-то ещё на пару, как ему и предлагают. Не вижу ничего страшного.
А где я вру? Мои слова описывают ситуацию, когда есть кодовая база двух языков, где один язык поддерживается одним, а другой - другим мейнтейнером. И для исправления ошибки кто-то в любом случае будет ждать выполнения работы другого. Вы же не знаете как будет, как будет и сколько это времени займёт. И я не знаю. И Кристоф не знает.
После принятия этих байндингов и покажут себя. Пока драйверов на расте немного, так что ничего страшного в этом нет.
А гарантий времени реакции нет ни у кого, даже у Кристофа. Или какое у него там SLA и что будет, если он его нарушит? Поэтому избирательно напирать на отсутствие гарантий от этих мейнтейнеров, когда их нет ни у кого — это признак либо глупости, либо интеллектуальной нечестности. Выбирайте сами.
Все кто находится в загончике чувствуют себя хорошо.
Конечно, ведь неславящих царька оттуда выкидывают.
Но это не подходит для критического, общественно важного ПО.
А C-макросы могут генерировать код? Я вроде думал, что они просто подменяют текст.
А с этим текстом потом что происходит, знаете?
И, кстати, макросы достаточно близки к тьюринг-полноте в теории (не отличаясь по выразительной силе от шаблонов, которые считаются тьюринг-полными несмотря на наличие зафиксированных в стандарте возможных ограничений на количество инстанциирований) и на практике (см. boost.preprocessor — там и циклы, и условия, и контейнеры, и много чего интересного можно сделать).
Это понимание приходит со временем.
Если вы хотите свести дискуссию к сверканию регалиями, то результат будет сильно не в вашу пользу. Я бы не рекомендовал.
Говорить, что копипаста помогает поддержке — это показывать, как говорится, что иногда старость приходит одна.
Все самые важные изменения пришли в C++11, а они с собой несут очень много специфичного поведения, которые для стабильности ядра linux, могут иметь отрицательный эффект.
Например?
Некоторые программисты например не знают, что семантика перемещения имеет свои особенности, и без костылей её не возможно применять. А костыли нужны. И часть таких костылей является частью стандартной библиотеки.
Например?
Ну, только чтобы это было вредно для ядра. Так-то костыли везде нужны, понятное дело.
А это значит, что нужно нести стандартную библиотеку языка C++ в ядро.
Только нужное для используемых вещей подмножество. std::thread для мув-семантики тащить не обязательно.
То есть, есть куча нюансов из-за которых просто так взять, и разрешить C++ в ядре нельзя
Этим аргументом и заботой о нюансах можно парализовать любую работу и любые изменения.
Да не, почему, я ж не спорю, ненужная на практике фигня. Точно так же, как и тесты — ненужная на практике фигня (с чем спорите уже вы).
Показал ради лулзов основания математики на расте, чем плохо? Это как судить об ООП по fizzbuzz enterprise edition (только, в отличие от ООП, математика интересна и полезна).
Почему? Нанимают же. Я прям сразу говорю, что не пишу тесты, и мне сразу оффер дают на ×2 от верхней границы вилки.
При этом вы топите за тесты и ООП, хотя никто не видел никакого правильного ООП, и тесты нафиг не нужны ни энтерпрайзу, ни его пользователям. Плюс, все эти тесты тестируют 2+2 = 4, очень классно.
Вы таки будете смеяться, но в HEB, крупнейшем техасском (и одном из крупнейших американских) продуктовом ритейлере
очень много бекенда на хаскеле.
Неявность. НеяВность. Вы же рядом:
Вы это сделали только что, предложив компилятору автоматически делать
moveв зависимости от нетривиальных условий. В том числе, тихо и без предупреждений ломать кодпри изменении другой перегрузки. Это напрочь ломает всю идею типизации (обеспечение гарантий компилятором), когда наличие (и последующее удаление)
doSmth(const std::string&)означает, что вы хотите именно копировать (или перемещать, неважно, но одно из поведений должно бытья вным) и потом перестать это делать.Иными словами, если я удаляю эту перегрузку, то я хочу, чтобы компилятор меня ткнул носом в те места, где я на неё опирался, чтобы я подумал, что с этим делать (заменить на мув, переписать алгоритм, вернуть перегрузку). Если вы хотите, чтобы происходило что-нибудь, лишь бы происходило — пишите на джаваскрипте. Это ровно ваш [object Object], так что непонятно, зачем вы undefined is not a function.
Перед тем, как раздавать советы, попробуйте научиться читать и не путать буквы, а затем — помнить, что вы же писали меньше суток назад. Задача со звёздочкой — продумывать, к чему приводят ваши предложения.
А если у вас
то надо копировать или перемещать?
А если у вас
то что вы здесь будете копировать или перемещать в вызове, где оба аргумента не rvalue?
А если я не хочу перемещать, в конце концов, то что мне делать? Сделаете
std::dontmove?Предложения «ну давайте мувать автоматически, и копировать тоже автоматически, и вообще» может выдавать только человек, который не писал ничего сложнее хелловорлдов, и с
std::moveзнаком по постам в блогах OTUS.Очень важная цель, мешающая на практике (нет).
Ура, наконец-то человек, с которым достоверно можно поговорить по существу!
Зачем этим выпасом заниматься? Они уже сами предложили свою помощь и кандидатуру.
Что имеет некоторые последствия, к слову, по части привлечения новых разработчиков (Кристоф, к сожалению или к счастью, не вечен).
Ну как тебе сказать…
Кстати, отдельный лайк за то, чтобы defined-поведение делать undefined. Такого настолько явного в настолько тривиальном коде я даже в плюсах не припомню сходу.
Я в очередной раз напомню, что девиз ядра для ядерных вещей — stable API is nonsense.
Вы проигнорировали некоторые мои вопросы, среди которых:
Вы можете указать конкретный сценарий возникновения проблем, когда копипаста байндингов в драйвера даёт преимущество по сравнению с их централизацией в одной папочке (не обязательной для сборки ядра настолько же, насколько необязательны драйвера)?
Где написано, что у Кристофа есть помощники-мейнтейнеры?
Какие гарантии по времени отзыва даёт Кристоф и другие мейнтейнеры?
Является ли принятое решение в ядре высеченным в граните на века?
На каком языке написаны блобы прошивок, и как это мешает разработке?
так что я теперь буду в начале комментария их повторять и пополнять этот список.
Я на всякий случай отмечу, что причина не становится технической от количества повторений, а конкретные сценарии вы так и не указали.
Достаточность этого для отказа в конкретном проекте просто показывает, что он окончательно скатился в клоунаду. Зачем по этому поводу испытывать вообще хоть какие-то эмоции, с которыми нужно было бы смиряться?
Сложно ему, очевидно. Или он у нас теперь демократически избранный лидер всех программистов, говорящий от их лица?
Ваша же цитата:
(курсив мой)
Если я сейчас напишу «maintaining C projects is a pain I have no interest in dealing with», то это станет непреложной истиной по одному факту того, что я так написал?
«Мне сложна но помощь не нужна»
«Копипастите везде»
Вы не можете быть настолько непроходимо глупым, чтобы считать это альтернативой. Вы троллите.
— Польза от раста не показана.
— Результаты гугла по использованию раста в AOSP говорят об обратном.
— Nim и Zig тоже где-то используют, и что?
— Не в крупных проектах уровня AOSP или не в крупно-ответственных проектах уровня проксей клаудфлары.
— Польза раста в крупных проектах не показана.
Вы не уважаете собеседников, тролля их глупостью, поэтому я не буду уважать вас и спрошу прямо: вы идиот? Вы не можете поддерживать контекст больше, чем на 10 минут или две реплики? Или какая вообще может быть причина человеку высказывать нечётные реплики в диалоге выше?
Vне обязан быть на стеке. В какой момент на стеке оказывается шаблонный аргумент здесь?Я не помню точную формулировку в стандарте, но это UB с типами вроде
intов и не UB с class non-type template parameters'ами (что и является C++20-фичей, и что вообще оправдывает существование этой функции — лично мне такое было нужно ровно для class NTTP).Например, этот код компилируется (что означает, что там нет UB), а если раскомментировать, то нет:
Ещё раз, sfinae плохо потому, что оно использует
enable_if, который является частью стандартной библиотеки, которую надо нести целиком или реализовывать с нуля? Я правильно понял вашу «логическую» цепочку?Ничего страшного, с кусками сишной библиотеки так и сделали.
Кстати, интересно, зачем.
Не во всех компаниях и C используют, и?
Ну вы ж сами показали, что C++20 полезнее и удобнее, чем, скажем, 17.
А откуда компилятору знать, хотите вы тут явный мув или нет? Когда сможете в общем случае определять, нужно ли тут:
вызывать
moveили нет, расскажите, мне пожалуйста. А то я могу к этому свести проблему останова, мы с вами вместе опубликуем эпохальную статью, и вы увековечите своё имя. Идёт?А когда неоднозначностей нет, то
std::moveвызывать не надо (например, implicit move в return, когда (N)RVO не срабатывает).Необязательность
moveв таких случаях делает код куда более чувствительным к рефакторингу, когда добавляется перегрузка функции, и код по-тихому ломается (давая худший перф на ровном месте).Человек, который в одном комментарии жалуется на неявность трейтов раста и опасливость к изменениям, а в другом предлагающий подобную хрупкую автомагию — это, конечно, смешно.
Когда говорят, что «X — однострочник», подразумевают, что остальные части языка всё ещё доступны. «X — однострочник на баше» не означает, что весь баш реализуется в одну строчку, или что используемые команды реализуются в одну строчку.
Вы проигнорировали некоторые мои вопросы, среди которых:
Вы можете указать конкретный сценарий возникновения проблем, когда копипаста байндингов в драйвера даёт преимущество по сравнению с их централизацией в одной папочке (не обязательной для сборки ядра настолько же, насколько необязательны драйвера)?
Где написано, что у Кристофа есть помощники-мейнтейнеры?
Какие гарантии по времени отзыва даёт Кристоф и другие мейнтейнеры?
Является ли принятое решение в ядре высеченным в граните на века?
На каком языке написаны блобы прошивок, и как это мешает разработке?
так что я теперь буду в начале комментария их повторять и пополнять этот список.
Это станет техническими причинами тогда, когда будут указаны конкретные сценарии, при которых что-то будет неудобно. Потому что программистский фольклор и общий опыт показывает, что так, как предлагают растаманы, таки удобнее.
Писал, мол, что двуязычные кодовые базы сложно поддерживать.
Я не писал про критику. Вы отвечаете на какие-то собственные голоса в голове.
Которое осмысленно настолько же, насколько осмысленно предложение написать собственный форматтер кода для C++ вместо использования существующих, а иначе решить (и высечь на камне), что стиля кода нет никакого.
Это норм. Мы все во что-то верим — в благонамеренность тех, с кем взаимодействуем, как пример.
Для того, чтобы это было ответом на моё «раст показывает свою пользу в крупных проектах» — да.
Не уверен, что вам что-либо ясно, потому что вы до сих пор воспринимаете предложение копипастить как адекватное контрпредложение.
И вы не указали, опять же, конкретные сценарии, показывающие профиты копипасты (что заставило меня добавить этот вопрос в список проигнорированных вами).
Что ж.
Что непонятно в enable_if_t?
Повод сразу использовать C++20!
Мог, но имею право выражать их в форме риторических вопросов. А вы, если бы хотели донести свою точку зрения, могли бы ответить и на вопрос в такой форме.
Почему? Чем std::move выше хуже std::move-магического интринсика компилятора?
Есть ровно одна причина, но она настолько несущественна, что на неё можно забить.
Нет, вы привели только общие слова (которые с тем же успехом могут быть применены и к C).
Вы проигнорировали некоторые мои вопросы, среди которых:
Где написано, что у Кристофа есть помощники-мейнтейнеры?
Какие гарантии по времени отзыва даёт Кристоф и другие мейнтейнеры?
Является ли принятое решение в ядре высеченным в граните на века?
На каком языке написаны блобы прошивок, и как это мешает разработке?
так что я теперь буду в начале комментария их повторять и пополнять этот список.
Например, в отсутствии технических причин? В предложении копипасты? В «мне сложно, но мне не нужны помощники»?
Ух мерзавец какой неадекватный. Ему сказали, что результатам его труда тут не рады, и ему нужно сделать тройной тулуп с переворотом и сплясать, а он, инфантильный эмоционал, отказался тулупиться и плясать, а просто пошёл по своим делам. Ужас!
Опять базарнобабковый дискурс пошёл.
Он это где-то написал, про обиду, про это всё? Или вы сами придумали?
Сколько кода на Zig, Nim и Odin в AOSP? Сколько кода на Zig, Nim и Odin в клаудфларовских проксях?
Вы серьёзно не понимаете разницы, или просто упражняетесь в демагогии?
На каждый растовский драйвер, очевидно. Потому что без этих обвязок его невозможно написать.
У этой лишней работы снова нет никаких технических причин.
Вы можете указать конкретный сценарий возникновения проблем, когда копипаста байндингов в драйвера даёт преимущество по сравнению с их централизацией в одной папочке (не обязательной для сборки ядра настолько же, насколько необязательны драйвера)?
Если шаблон убрать, то откуда взять
V?Нет, эта функция иногда вполне корректна. А иногда — нет. Почему?
Например, по личным причинам — ну не нравится Торвальдсу язык, и всё тут. Или по легаси-причинам — просто потому, что в 91-м году с компиляторами и стандартом C++ было всё очень плохо.
Так в чём конкретно проблема со sfinae, можете сказать? Особенно чтоб в C++11 она усугубилась, как вы изначально говорили.
Этот вопрос — риторический, и является ответом на ваш псевдоаргумент. Собственно, вопрос к этому ответу, и вы так и не пояснили, в чём конкретно проблемы.
Всегда копируют, что ли? Ну вот заодно перемещать научатся. Видите, одни плюсы!
Не понял, почему не могу? Не принимаю патч, который добавляет что-то, точно так же, как не приму патч, который сегодня добавляет
thrd_create.Это вообще однострочники, их самому можно написать, в чём костыльность и в чём проблема?
Вы упорно избегаете конкретики, просто размахивая руками и высказывая общие тезисы.
Развивается. И библиотеки, конечно, и сам компилятор: например, относительно недавно линейные типы запилили, и планомерно-постепенно готовятся к зависимым типам (например, в ghc 9.12 запилили https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0281-visible-forall.rst ).
Нет, конечно. Достаточно дать им мейнтейнить соответствующую субдиректорию, и нет никаких проблем.
Он имеет право даже отказать в патче, у которого первый символ каждой строки, начиная с 17-й, не складывается в фразу "c{hristoph is the greatest man on earth}". Вопрос в адекватности этих отказов, и мы обсуждаем именно его.
Исключительно потому, что отдельный код на каждый драйвер никто не будет делать, и он это понимает.
Высечено в граните прям?
Там кроме лозунгов ещё есть отчёты по дырявости кодовой базы на сях и плюсах и кодовой базы на расте в андроиде, например. И есть конкретные работающие продукты, которые выбрано делать на расте. Но это всё, конечно, мелочи и лозунги.
Покажите, где в списке мейнтейнеров указано, что они конкретно помощники Кристофа.
Ну либо это, либо он царёк с ЧСВ, тут выбора нет.
Человек в одном комментарии пишет по смыслу «красивые лозунги мноиге умеют писать, поэтому неважно, что говорят» и «ну раз человек что-то написал, то это должно быть правдой, буду исходить из этого».
Спасибо вам за дискуссию, вы даёте повод орать в голосину просто в каждом комментарии.
Про своё отношение к расту я уже писал. В данном же случае меня задевает только непроходимая, фанатичная глупость некоторых персонажей, защищающих такие решения и всерьёз предлагающих копипастить код для улучшения его поддерживаемости, или очень избирательно применяющих аргументы уровня «технология может быть опасной, она не всегда приводит к тому, что хочется». Но это скорее даже не задевание, а персональный челлендж такой — получится ли что-то донести человеку, который даже осилил открыть браузер и набрать там эйч эй би ар дот ком <enter>, поэтому обладает, наверное, какими-то когнитивными способностями, или не.
Это что за аргумент вообще такой? Какой мейнстримный ЯП всегда работает так, как задумано?
А как сишники сейчас справляются с тем, когда нужно и то, и то?
Кстати, на плюсах я могу сделать что-то в духе
и использовать как
— всё предельно явно, грепабельно и типобезопасно (насколько это может быть безопасно для языков C-семейства).
И линтер действительно ругнётся, например, clang-tidy:
Да, конечно. Например, не имея этих инклюдов в путях компилятора в процессе сборки.
Лол. Lmao even. В который раз убеждаюсь, что самые ярые фанаты сишки нихрена не знают о C, а самые ярые фанаты штабильности в ядре нихрена не знают ни о конкретном обсуждаемом ядре. Кекспертиза уровня опеннета.
Читайте https://kernelnewbies.org/FAQ/LibraryFunctionsInKernel . Потом можете погрепать исходники ядра на предмет упомянутой функции. Хотя не, у вас же их под рукой нет, так что я сделаю это за вас:
знаете, что это значит?
В каком месте пытаются? Ему говорят, что обвязки готовы мейнтейнить другие люди.
Уже показало в опыте других компаний, от гугла с андроидом до cloudflare.
Где в процитированной вами фразе написано, что у него уже есть помощники?
Кстати, какие есть гарантии, что эти другие мейнтейнеры будут реагировать на проблемы в данный срок, как вы требовали ранее?
Контекст дискуссии — растобайндинги. Вы говорите, что я не учитываю контекст высказываний, а потом сами берёте и выкидываете этот контекст.
А кодовая база, кстати, уже многоязычная. Проприетарные прошивки-блобы на каком языке написаны, по-вашему? Скрипты для системы сборки на чём написаны?
В процитированной вами фразе этого нет.
Говорить на серьёзных щщах «Я не буду принимать эти изменения в мой проект, пока эти изменения не покажут себя в моём проекте» не может даже сишник.
Мне нравится, как легко вы распоряжаетесь чужим временем и усилиями при полном отсутствии технических причин для отказа.
Мои соболезнования, конечно, но это многое из ваших офигительных высказываний объясняет.
Было в C++03. C++11 добавило expression sfinae, но это вопрос юзабельности и упрощает метапрограммирование.
Впрочем, как шаблоны и sfinae влияют на стабильность ядра linux?
Это надо как-то отдельно постараться ещё.
Как там с use-after-free дела, кстати?
Кто сказал?
Напомню, кстати, что ядро написано не на стандартном C, а на диалекте. Апеллировать к отсутствию каких-то ограничений в стандарте плюсов — это снова интеллектуальная нечестность.
Что, даже
thrd_createможно в ядерном коде?Если человек не может выполнять работу сам, значит, нужны.
Если не требуется. А переход на rust — это вполне себе полезное изменение.
Окей, покажите, где что выкинуто из контекста, и где переводы неверны. С отсылкой к оригиналу, конечно.
А будет сопровождать вместе с кем-то ещё на пару, как ему и предлагают. Не вижу ничего страшного.
После принятия этих байндингов и покажут себя. Пока драйверов на расте немного, так что ничего страшного в этом нет.
А гарантий времени реакции нет ни у кого, даже у Кристофа. Или какое у него там SLA и что будет, если он его нарушит? Поэтому избирательно напирать на отсутствие гарантий от этих мейнтейнеров, когда их нет ни у кого — это признак либо глупости, либо интеллектуальной нечестности. Выбирайте сами.
Конечно, ведь неславящих царька оттуда выкидывают.
Но это не подходит для критического, общественно важного ПО.
А с этим текстом потом что происходит, знаете?
И, кстати, макросы достаточно близки к тьюринг-полноте в теории (не отличаясь по выразительной силе от шаблонов, которые считаются тьюринг-полными несмотря на наличие зафиксированных в стандарте возможных ограничений на количество инстанциирований) и на практике (см. boost.preprocessor — там и циклы, и условия, и контейнеры, и много чего интересного можно сделать).
Если вы хотите свести дискуссию к сверканию регалиями, то результат будет сильно не в вашу пользу. Я бы не рекомендовал.
Говорить, что копипаста помогает поддержке — это показывать, как говорится, что иногда старость приходит одна.
Например?
Например?
Ну, только чтобы это было вредно для ядра. Так-то костыли везде нужны, понятное дело.
Только нужное для используемых вещей подмножество.
std::threadдля мув-семантики тащить не обязательно.Этим аргументом и заботой о нюансах можно парализовать любую работу и любые изменения.