C ++ 17 вводит [[nodiscard]]
атрибут, который позволяет программистам отмечать функции таким образом, что компилятор выдает предупреждение, если возвращаемый объект отбрасывается вызывающей стороной; один и тот же атрибут может быть добавлен ко всему типу класса.
Я читал о мотивации этой функции в исходном предложении , и я знаю, что C ++ 20 добавит атрибут к стандартным функциям вроде std::vector::empty
, имена которых не передают однозначного значения относительно возвращаемого значения.
Это крутая и полезная функция. На самом деле, это кажется слишком полезным. Везде, где я читаю [[nodiscard]]
, люди обсуждают это так, как если бы вы просто добавили его в несколько избранных функций или типов и забыли обо всех остальных. Но почему неотбрасываемое значение должно быть особым случаем, особенно при написании нового кода? Разве возвращаемое возвращаемое значение обычно не является ошибкой или, по крайней мере, тратой ресурсов?
И не является ли один из принципов проектирования самого C ++, что компилятор должен отлавливать как можно больше ошибок?
Если это так, то почему бы не добавить [[nodiscard]]
свой собственный, не унаследованный код почти к каждой отдельной void
функции и почти к каждому типу класса?
Я пытался сделать это в своем собственном коде, и он отлично работает, за исключением того, что он настолько ужасный, что начинает ощущаться как Java. Казалось бы, гораздо более естественно заставить компиляторы предупреждать об исключенных возвращаемых значениях по умолчанию, за исключением нескольких других случаев, когда вы отмечаете свое намерение [*] .
Поскольку я видел нулевые дискуссии об этой возможности в стандартных предложениях, записях в блогах, вопросах переполнения стека или где-либо еще в Интернете, я должен что-то упустить.
Почему такая механика не имеет смысла в новом коде C ++? Является ли многословие единственной причиной, по которой его нельзя использовать [[nodiscard]]
почти везде?
[*] Теоретически, [[maydiscard]]
вместо этого у вас может быть что-то вроде атрибута, который также может быть задним числом добавлен к функциям, как printf
в реализациях стандартной библиотеки.
const
могут раздуваться в противном случае «простой» класс (или , вернее , «простой старый объект данных») значительно в C ++.
std::vector
or std::unique_ptr
, для которых вам просто нужны члены-данные в определении класса. Я работал с обоими языками; Ява - хороший язык, но он более многословен.
operator =
например. Иstd::map::insert
.