属性说明符序列是否继承?

时间:2017-11-03 21:42:16

标签: c++ c++11 c++14 language-lawyer c++17

请看这个片段:

struct [[nodiscard]] Result {
};


struct DiscardableResult: Result {
};

DiscardableResult是否具有[[nodiscard]]属性?如果是,是否有可能以某种方式删除它?

1 个答案:

答案 0 :(得分:15)

[dcl.attr.nodiscard] / 2说:

  

nodiscard调用是一个函数调用表达式,它调用先前声明为nodiscard的函数,或者其返回类型可能是cv限定的类或标记为nodiscard的枚举类型。

函数的返回类型是DiscardableResult。此类型未标记nodiscard,如[dcl.attr.grammar] / 5中所定义:

  

每个属性说明符-seq被认为属于某个实体或语句,由语法上下文所标识(第9条,第10条,第11条)。如果属于某个实体或语句的attribute-specifier-seq包含不允许应用于该实体或语句的属性或alignment-specifier,则该程序格式错误。如果属性说明符-seq附属于朋友声明(14.3),则该声明应为定义。没有attribute-specifier-seq属于显式实例化(17.7.2)。

强调补充。

DiscardableResult的“句法上下文”中没有属性。因此,没有属性“附属于”此实体。

属性不会被继承。