【问题标题】:Does attribute specifier sequence inherit?属性说明符序列是否继承?
【发布时间】:2018-04-16 17:14:43
【问题描述】:

看看这个sn-p:

struct [[nodiscard]] Result {
};


struct DiscardableResult: Result {
};

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

【问题讨论】:

  • 标准并没有说明属性是继承的,所以我认为我们应该假设属性一般不是继承的。该标准也没有说明nodiscard 是继承的。
  • gcc 和带有-std-c++1z 的clang 似乎都没有继承该属性。

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


【解决方案1】:

[dcl.attr.nodiscard]/2 说:

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

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

每个属性说明符序列都被称为属于某个实体或语句,由它出现的句法上下文标识(第 9 条、第 10 条、第 11 条)。如果属于某个实体或语句的属性说明符序列包含不允许应用于该实体或语句的属性或对齐说明符,则程序格式错误。如果属性说明符序列属于友元声明(14.3),则该声明应为定义。任何属性说明符序列都不应属于显式实例化 (17.7.2)。

添加了重点。

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

属性不会被继承。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 2016-11-13
    • 2018-09-09
    • 2011-06-15
    • 2019-09-04
    • 1970-01-01
    • 2011-04-26
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多