[dcl.attr.nodiscard]/2 mówi:
nodiscard
wezwanie jest wyrażeniem wywołanie funkcji, która wywołuje funkcję wcześniej zadeklarowane nodiscard
lub których powrót typ jest klasą ewentualnie cv wykwalifikowany lub wyliczenie typ oznaczony nodiscard
.
Typ zwrotu funkcji to DiscardableResult
. Ten typ nie zaznaczono nodiscard
, jak zdefiniowano w [dcl.attr.grammar]/5:
Każdy atrybut specyfikator-nast mówi się odnosić się do pewnej jednostki lub rachunku, określone przez składniowej kontekście w których to pojawia się (Klauzula 9, Klauzula 10, Klauzula 11). Jeśli parametr-specyfikator-seq, który występuje w jakiejś jednostce lub instrukcji, zawiera atrybut lub specyfikator linii trasowania, który nie może być zastosowany do tego elementu lub instrukcji, program jest źle sformułowany. Jeżeli specyfikator atrybutów-seq ma zastosowanie do deklaracji przyjacielskiej (14.3), deklaracja ta jest definicją. Specyfikator atrybutów-seq nie ma zastosowania do jawnego tworzenia (17.7.2).
Podkreślenie dodane.
Brak atrybutu w "kontekście semantycznym" DiscardableResult
. Dlatego żaden atrybut "nie odnosi się" do tego bytu.
Atrybuty nie są dziedziczone.
Standard nie stwierdza, że atrybuty są dziedziczone, więc uważam, że powinniśmy założyć, że atrybuty nie są ogólnie dziedziczone. Standard nie stwierdza również, że dziedziczenie "nodiscard". – Brian
zarówno gcc, jak i clang z '-std-C++ 1z' nie dziedziczą tego atrybutu. – bolov