std::istream
не является подвижным , так что практической пользы для этого нет.
Это уже сигнализирует о том, что вещь может быть «модифицирована», не путаясь с предположением, что вы передаете право собственности на объект std::istream
(что вы не делаете и не можете сделать).
Я могу отчасти увидеть обоснование использования этого, чтобы сказать, что поток логически перемещается, но я думаю, что вы должны провести различие между «владением этой вещью передается», и «Я сохраняю право собственности на эту вещь, но я позволю вам использовать все ее услуги». Передача прав собственности довольно хорошо понимается как соглашение в C ++, и это не совсем так. Что подумают пользователи вашего кода, когда им придется написать parse(std::move(std::cin))
?
Хотя ваш путь не «опасен»; вы не сможете ничего сделать с этой ссылкой на rvalue, что вы не сможете сделать с ссылкой на lvalue.
Было бы гораздо более самодокументированным и обычным делом просто взять ссылку на lvalue.
Я готов звенеться для этого, но ядро Linux является студенческим проектом, который вышел из-под контроля. Более серьезно то, что ядро Linux преуспевает с точки зрения программирования, устанавливают очень твердый набор инструкций по дизайну и кодированию, которые позволяют очень большому количеству людей способствовать, все еще имея все совмещается.
Люди, которым я доверяю, кто сделал операционные системы работой их жизни, говорят мне, что ядро BSD является намного лучшим примером хорошего программирования C и хорошего дизайна ОС. Я знаю достаточно преподавателей в Беркли, что я не удивлен этим требованием.
Более широко ядра ОС являются узкоспециализированными вещами---нет ничего господствующей тенденции о ядре. Если Вы хотите примеры хорошей практики C, Вы могли бы судить Kernighan и книгу Щуки по Практике Программирования. Или если Вы хотите изучить реальную систему, реализация Lua является достаточно маленькой, что можно считать все это, чрезвычайно хорошо спроектированный, и невероятно портативный---работает на любой платформе с компилятором C ANSI.
Извинения за субъективный и спорный ответ :(
Что Вы подразумеваете под хорошим примером? Я полагаю, что ядро Linux является очень хорошо записанным ядром в C с некоторыми проблемами, многие из которых очищаются. Однако до использования его как пример того, как написать код генерала C, я не думаю, что он вполне соответствует. Чтение и понимание ядра будут учить Вас много C. Но то, что Вы не найдете в ядре, является любыми библиотеками для разговора о. Стандартные библиотеки недоступны. Так, например, Вы будете видеть "printk" вместо "printf" и т.д. Существует также некоторое темное волшебство. Ядро является совершенно особым случаем. Я не использовал бы его для нахождения лучших практик, скажем, если бы Вы писали некоторое общее применение как файловый менеджер или база данных.
Да, это.
Если Вы не хотите быть переполненными деталями ядра, можно запустить с некоторых служебных функций Linux, записанных в C. См. ответы на этот вопрос для получения дополнительной информации о том, как получить источник.
Другое хорошее место для чтения исходного кода C находится в C очень собственная Стандартная Библиотека.
Наконец, еще один недавний проект C, о котором я слышу хорошие вещи, является Мерзавцем.
Для основных программ? Нет. *отклоните код ядра, обычно находится не в пространстве пользователя, и как таковой имеет различные конвенции и требования, чем самое "основное" программирование. Это - однако, часть лучшего и кода C высшего качества, который можно изучить для приобретения знаний из. Это имеет свои слабые места, и это не совсем правильно написано, но по большей части это - очень эффективный, чистый код.
Я предложил бы смотреть на утилиты гну (например, исходный код для стандартных утилит Unix, таких как 'ls' и 'awk'), поскольку они собираются быть легче понять, и более вероятная попытка быть записанным более чистым способом (ядро имеет различные потребности производительности и проблемы совместимости, чем другие типы программного обеспечения).
Если Вы спрашиваете с точки зрения изучения C, то это могло бы быть слишком подавляющим для запуска. Что касается использования C, это подходит лучше всего для приложений, требующих мобильности и производительность. Это является наиболее часто используемым для системного программирования уровня. Но, это делает так за счет абстракции. Поэтому необходимо сделать объем кодирования себя в отличие от языка как Java или даже C++. Идеально, Ваш тип приложения должен решить, что выбором языка, и с операционными системами C является способ пойти.
Один способ пойти о приобретении знаний о ядре Linux начинает с очень старой версии ядра Linux. Это содержало бы суть и скрыло бы дополнительную сложность, существующую в текущем ядре. Это должно быть достаточно в понимании основ.
Является ли это "лучшей практикой", зависит от того, кого Вы спрашиваете. Существует много низкоуровневых C программ, записанных на платформе Windows также, но если Вы будете смотреть на них (например, примеры драйвера устройства от WINDDK), то Вы поймете, что Microsoft успешно изобрела другой язык, что они называют C :-) Но тем не менее, их нужно, вероятно, рассмотреть как "лучшую практику", если Вы когда-нибудь хотите разработать драйверы устройств в Windows.
Одно превосходное место состоит в том, чтобы посмотреть на код некоторого используемого компилятора с открытым исходным кодом. Вам нужны превосходная структура данных и навыки указателя для записи компилятора.
Я считаю, что ядро является очень хорошим примером того, как писать модульный код. Несмотря на то, что он C, он в некоторой степени объектно-ориентирован.