9

最近发布了 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 都是可以按任意顺序出现的属性,还是不是?

4

1 回答 1

8

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

根据[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],adecl-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 中的可选属性说明符序列属于由前面的 decl 说明符确定的类型

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

于 2021-05-12T20:20:14.460 回答