【问题标题】:warning C5240: 'nodiscard': attribute is ignored in this syntactic position警告 C5240:“nodiscard”:在此句法位置忽略属性
【发布时间】:2021-08-02 17:35:15
【问题描述】:

最近发布了 Visual Studio 2019 版本 16.9.5。它显然引入了新的警告:

[[nodiscard]] __declspec(dllexport) bool foo(); //ok
__declspec(dllexport) [[nodiscard]] bool bar(); // warning C5240: 'nodiscard': attribute is ignored in this syntactic position

其实我以为nodiscard和dllexport都是可以任意顺序出现的属性,还是不是?

【问题讨论】:

  • 一个是标准的,另一个是特定于实现的。就任何规范而言,这里都没有真正的“正确”行为。作为一个 QoI 问题,我同意这是令人惊讶/令人烦恼的。

标签: c++ visual-studio-2019 warnings nodiscard


【解决方案1】:

我今天也收到了这个警告,所以决定调查一下。这需要看一下标准,并将不同的部分放在一起。

根据[dcl.fct.def.general],函数定义为:

function-definition:
   attribute-specifier-seq_opt decl-specifier-seq_opt declarator virt-specifier-seq_opt function-body

这很重要,因为它指定可选的decl-specifier-seq 位于attribute-specifier-seq(包括[[nodiscard]])之后。

现在,根据[dcl.spec.general]decl-specifier-seq 定义为:

decl-specifier-seq:
   decl-specifier attribute-specifier-seq_opt
   decl-specifier decl-specifier-seq

根据微软__declspec的文档,定义为decl-specifier;因此,__declspec(dllexport) 必须在 [[nodiscard]] 属性之后。

注意:

decl-specifier-seq 中的可选属性-specifier-seq 属于由前面确定的类型 声明说明符

因此,[[nodiscard]] 之后 __declspec(dllexport) 仅适用于__declspec(dllexport)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多