C ++ 17 вводить [[nodiscard]]
атрибут, який дозволяє програмістам позначати функції таким чином, що компілятор видає попередження, якщо повернутий об'єкт відкидається абонентом; той самий атрибут може бути доданий до всього типу класу.
Я читав про мотивацію цієї функції в оригінальній пропозиції , і знаю, що C ++ 20 додасть атрибут до стандартних функцій типу std::vector::empty
, імена яких не передають однозначного значення відносно значення, що повертається.
Це класна і корисна функція. Насправді це майже здається занадто корисним. Скрізь, де я читав [[nodiscard]]
, люди обговорюють це так, ніби ви просто додали його до декількох функцій чи типів і забули про інше. Але чому нерозбірне значення має бути окремим випадком, особливо при написанні нового коду? Чи не відхилена повернена вартість, як правило, помилка чи принаймні витрата ресурсів?
І чи не є одним із принципів дизайну самого C ++, що компілятор повинен виявити якомога більше помилок?
Якщо так, то чому б не додати [[nodiscard]]
власний, не застарілий код майже до кожного окремого нефункціонального void
і майже до кожного окремого типу класу?
Я намагався це зробити у власному коді, і він працює чудово, за винятком настільки страшенно багатослівного, що він починає відчувати себе як Java. Здається, набагато природніше змусити компіляторів попередити про відкинуті значення повернення за замовчуванням, за винятком кількох інших випадків, коли ви відзначаєте свій намір [*] .
Оскільки я бачив нульові дискусії про цю можливість у стандартних пропозиціях, записах у блогах, питаннях переповнення стека чи деінде в Інтернеті, я мушу щось бракувати.
Чому така механіка не має сенсу в новому коді C ++? Чи є багатослів’я єдиною причиною не користуватися [[nodiscard]]
майже скрізь?
[*] Теоретично у вас може бути щось на зразок [[maydiscard]]
атрибута, який також може бути доданий заднім числом до функцій, як printf
у реалізаціях стандартних бібліотек.
const
можуть значно погіршити "простий" клас (а точніше "звичайний старий об'єкт даних") значно в C ++.
std::vector
або std::unique_ptr
для яких вам просто потрібні члени даних у визначенні вашого класу. Я працював з обома мовами; Java - це нормально мова, але вона є більш багатослівною.
operator =
наприклад. Іstd::map::insert
.