Наследует ли последовательность спецификаторов атрибутов?
Посмотрите на этот фрагмент:
struct [[nodiscard]] Result {
};
struct DiscardableResult: Result {
};
Имеет ли DiscardableResult атрибут [[nodiscard]]? Если да, можно ли как-то удалить его?
Ответ 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 нет атрибута. Следовательно, никакой атрибут "не прикрепляется" к этому объекту.