Ответ 1
[dcl.attr.nodiscard]/2 говорит:
A
nodiscard
вызов - это выражение вызова функции, которое вызывает ранее объявленную функциюnodiscard
или чей тип возврата является, возможно, cv-классом или типом перечисления, отмеченнымnodiscard
.
Возвращаемым типом функции является DiscardableResult
. Этот тип не помечен nodiscard
, как определено в [dcl.attr.grammar]/5:
Каждый атрибут-спецификатор-seq, как говорят, относится к некоторому сущности или оператору, идентифицированному синтаксическим контекстом , где он отображается (пункт 9, раздел 10, раздел 11). Если атрибут-спецификатор-seq, который входит в какой-либо объект или оператор, содержит атрибут или спецификатор выравнивания, которые не могут применяться к этому объекту или инструкции, программа плохо сформирована. Если атрибут-спецификатор-seq содержит объявление друга (14.3), это определение должно быть определением. Никакой атрибут-спецификатор-seq не должен содержать явного экземпляра (17.7.2).
Добавлен акцент.
В "семантическом контексте" DiscardableResult
нет атрибута. Следовательно, никакой атрибут "не прикрепляется" к этому объекту.
Атрибуты не наследуются.