2017-11-03 17 views
17

Spójrz na tym fragmencie:Czy dziedziczy się sekwencja specyfikatora atrybutu?

struct [[nodiscard]] Result { 
}; 


struct DiscardableResult: Result { 
}; 

Czy DiscardableResult mają atrybut [[nodiscard]]? Jeśli tak, czy można go jakoś usunąć?

+0

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

+0

zarówno gcc, jak i clang z '-std-C++ 1z' ​​nie dziedziczą tego atrybutu. – bolov

Odpowiedz

12

[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.