В разделе « Другие функции C ++», «Аргументы ссылок » Руководства по стилю Google C ++ , я читал, что неконстантные ссылки не должны использоваться.
Все параметры, передаваемые по ссылке, должны быть помечены как const.
Ясно, что рассмотрение вызовов функций, использующих ссылки в качестве аргументов, абсолютно запутанно для программистов на C, но C и C ++ теперь разные языки. Если выходной параметр необходим , используя указатель для требуемого выходного параметра, может вызвать все тело функции должны быть пропущено, что делает реализацию функции более сложной (формально увеличивает цикломатическую сложность и глубину от функции).
Я хотел бы сделать код C ++ настолько простым для понимания / поддержки, насколько это возможно, поэтому мне, как правило, интересно читать руководства по стилю кодирования. Но для того, чтобы адаптировать лучшие практики в команде, я думаю, что понимание обоснования элементов руководства по стилю является важным фактором.
Неконстантные ссылки действительно так плохи? Запрещено ли это только для Google или это общепринятое правило? Что оправдывает дополнительные усилия для реализации выходных параметров в качестве указателей?
Ответы:
Логическое обоснование руководства по стилю Google заключается в том, чтобы на сайте вызова функции было ясно, является ли параметр входным параметром или выходным параметром. (См. Здесь для дальнейшего обсуждения.) Другие языки определяют параметры, явно заданные; Например, в C # есть
out
ключевое слово, которое необходимо использовать на сайте вызовов . Поскольку C ++ не делает это явно, Google решил использовать const ref. против указателя, чтобы было понятно.Это только правило Google? Нет, но я сомневаюсь, что это очень широко распространено. Я не думаю, что видел его вне руководства по стилю Google и групп, которые явно придерживаются частей руководства по стилю Google. (Например, мне понравилась идея, когда я впервые прочитал руководство по стилю Google много лет назад и использовал его для своего собственного кода.)
В частности, недавно объявленные основные принципы C ++ предпочитают возвращаемые значения выходным параметрам (почти) для всего и используют неконстантные ссылки для остальных. Использование Google указателей и ссылок может сделать выходные параметры более понятными, но возвращаемые значения еще яснее. Теперь, когда C ++ 11 имеет стандартизированные перемещения (ссылки на значения,
&&
чтобы сделать возврат многих типов дешевыми) и кортежи (позволяющие легко возвращать несколько значений), многие из вариантов использования для параметров out больше не применяются.Основные принципы C ++ имеют несколько громких имен (Bjarne Stroustrup, Herb Sutter), поддерживаются Microsoft и охватывают новейшие функции C ++ (в отличие от руководства по стилю Google), поэтому я ожидаю, что его рекомендации будут более популярными, чем Google.
источник
Есть 2 варианта работы с недопустимым указателем, переданным в первую очередь, с первой проверкой и ранним возвратом, или пусть это будет неопределенным поведением (если вам важнее скорость, чем надежность).
Проверка так же проста, как:
Этот тип проверки обычно принимается как проверка параметров. Если вы видите код, то совершенно очевидно, что вы ожидаете, что ненулевой указатель будет передан и вернется раньше, если нет. Это позволяет вам не беспокоиться о недействительных указателях.
источник
assert(buffer);
Зная, что assert активен только для отладочной версии, я иногда хочу иметьrt_assert(buffer);
исключение, которое вызывает исключение. Отступыreturn
выглядят немного опасно ... Кстати: ваш фрагмент кода - хорошая иллюстрация моего вопроса о указателях для вывода.Все сводится к вашему наблюдению
If an output parameter is required
.Единственное место, где сигнатура функции должна иметь выходной параметр, - это когда он задан внешним API, и в таком случае вы просто оборачиваете внешний API во что-то, гарантирующее, что всегда есть действительный pointee.
Внутренне вы избегаете выходных параметров, расширяя возвращаемый тип, чтобы он был составным из всех «аутов»
источник
The only place where...
действительно ли ваше правило применимо ко всем случаям. То, что вы предлагаете, выглядит так: избегайте выходных параметров в функциях ваших собственных программ. Правда для новых программ.