我今天也收到了这个警告,所以决定调查一下。这需要看一下标准,并将不同的部分放在一起。
根据[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)