2017-11-03 1 views
17

Schauen Sie sich das Snippet:Erbt die Attributspezifizierersequenz?

struct [[nodiscard]] Result { 
}; 


struct DiscardableResult: Result { 
}; 

hat DiscardableResult das [[nodiscard]] Attribut? Wenn ja, ist es möglich, es irgendwie zu entfernen?

+0

Der Standard besagt nicht, dass Attribute vererbt werden, daher sollten wir davon ausgehen, dass Attribute im Allgemeinen nicht vererbt werden. Der Standard besagt auch nicht, dass "nodiscard" vererbt wird. – Brian

+0

gcc und clang mit '-std-C++ 1z' ​​scheinen das Attribut nicht zu erben. – bolov

Antwort

12

[dcl.attr.nodiscard]/2 sagt:

Ein nodiscard Aufruf ist ein Funktionsaufruf Ausdruck, der eine Funktion zuvor nodiscard erklärt nennt, oder dessen Rückgabetyp ist eine möglicherweise cv qualifizierten Klassen oder Aufzählung Typ markiert nodiscard.

Der Rückgabetyp der Funktion ist DiscardableResult. Dieser Typ ist nicht nodiscard markiert, wie in [dcl.attr.grammar]/5:

Jeder Attribut-specifier-Seq wird gesagt, einige Unternehmen oder Aussage appertain, durch den syntaktischen Kontext identifiziert, in denen es erscheint (Abschnitt 9, Abschnitt 10, Abschnitt 11). Wenn ein attribute-specifier-seq, der zu einer Entität oder einer Anweisung gehört, ein Attribut oder eine Ausrichtungsspezifikation enthält, die nicht auf diese Entität oder Anweisung angewendet werden darf, ist das Programm schlecht formatiert. Wenn ein Attribut-Spezifizierer-seq zu einer Friend-Deklaration gehört (14.3), soll diese Deklaration eine Definition sein. Zu einer expliziten Instantiierung (17.7.2) darf kein Attribut-Spezifizierer-Seq gehören.

Hervorhebung hinzugefügt.

Es gibt kein Attribut im "semantischen Kontext" von DiscardableResult. Daher "gehört" kein Attribut zu dieser Entität.

Attribute werden nicht vererbt.

Verwandte Themen