2017-11-03 5 views
17

ルック:DiscardableResult[[nodiscard]]属性を属性指定子シーケンスは継承していますか?このスニペットで

struct [[nodiscard]] Result { 
}; 


struct DiscardableResult: Result { 
}; 

を持っていますか?はいの場合は、何とか削除することは可能ですか?

+0

標準では、属性が継承されているとは言いませんので、属性が一般的に継承されていないと仮定する必要があります。この規格は、 'nodiscard'が継承されているとも述べていません。 – Brian

+0

gccと '-std-C++ 1z'のclangは属性を継承していないようです。 – bolov

答えて

12

[dcl.attr.nodiscard]/2と言う:

nodiscardコールが以前nodiscard宣言された関数を呼び出す関数呼び出し式である、またはその戻り値の型が、おそらくCV-修飾クラスまたは列挙ですタイプnodiscardと記されています。

戻り値の型はDiscardableResultです。/5 [dcl.attr.grammar]で定義されているこのタイプは、nodiscardにマークされていません:各属性指定子-seqが、いくつかのエンティティまたはステートメントにappertainと言われて

構文のコンテキストで識別される、それをどこに(第9条第10項第11項)と表示されます。あるエンティティまたはステートメントに属する属性指定子が、そのエンティティまたはステートメントに適用することが許可されていない属性または整列指定子を含んでいる場合、そのプログラムは不正です。 attribute-specifier-seqがフレンド宣言(14.3)に属する場合、その宣言は定義とする。 attribute-specifier-seqは明示的インスタンス化(17.7.2)に属さないものとする。

強調が追加されました。

「セマンティックコンテキスト」には、DiscardableResultの属性はありません。したがって、このエンティティには「属している」属性はありません。

属性は継承されません。

関連する問題