Подтвердить что ты не робот

Наследует ли последовательность спецификаторов атрибутов?

Посмотрите на этот фрагмент:

struct [[nodiscard]] Result {
};


struct DiscardableResult: Result {
};

Имеет ли DiscardableResult атрибут [[nodiscard]]? Если да, можно ли как-то удалить его?

4b9b3361

Ответ 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 нет атрибута. Следовательно, никакой атрибут "не прикрепляется" к этому объекту.

Атрибуты не наследуются.