![](/img/trans.png)
[英]Why is the STL Container function empty() marked as [[nodiscard]]?
[英][[nodiscard]] to a function pointer
我想使用第三方函数,它通过一个充满 function 指针的结构提供它的 API。 例如:
struct S {
using p_func1 = int(*)(int, int);
p_func1 func1;
using p_func2 = int(*)(char*);
p_func2 func2;
}
第三方库初始化这个结构。 需要检查这些函数(func1、func2)的返回值,我希望我能以某种方式在[[discard]]
属性上显示以确保检查返回值。
有没有办法做到这一点,同时保持结构的 ABI?
编辑:到目前为止,我能想到的最好的办法就是拥有另一个结构,如下所示:
struct S_wrap {
S orig;
[[nodiscard]] int func1(int a, int b){ return orig.func1(a, b); }
[[nodiscard]] int func2(char* a){ return orig.func2(a); }
}
我希望有更好的东西
您的包装器(或任何包装器)是唯一的方法。 该属性适用于函数declarator-id(其名称),而不是函数的类型。 所以它在使用指针时丢失了,也不能应用于指针本身:
[dcl.attr.nodiscard]
1属性标记
nodiscard
可以应用于函数声明中的declarator-id或类或枚举的声明。 它应该在每个属性列表中最多出现一次,并且不存在attribute-argument-clause。
因此,如果函数指针返回一个int
,那么防止丢弃结果的唯一方法是使用某种带有已应用属性的命名函数(或operator()
)的包装器。
如果您使用的是 GCC,则可以改用__attribute__((warn_unused_result))
。 与[[nodiscard]]
不同,它确实适用于typedef
或using
:
struct S2 {
using p_func1 = __attribute__((warn_unused_result)) int(*)(int, int);
p_func1 func1;
using p_func2 = __attribute__((warn_unused_result)) int(*)(char*);
p_func2 func2;
};
有趣的是,Clang 接受此代码但不使用该属性并且不会发出警告。 另外,它要求__attribute__
放在最前面(如上),当它放在最后时会拒绝, before ;
.
您可以使用[[gnu::warn_unused_result]]
来进一步 go:
struct S {
using p_func1 = int(*)(int, int) [[gnu::warn_unused_result]];
p_func1 func1;
using p_func2 = int(*)(char*) [[gnu::warn_unused_result]];
p_func2 func2;
};
使用 GCC,您可以将[[gnu::warn_unused_result]]
放在末尾(如上所示)或开头:
using p_func1 = [[gnu::warn_unused_result]] int(*)(int, int);
就像您在 function 上使用[[nodiscard]]
一样。但是,Clang 和 MSVC(可能还有其他)将拒绝第二种形式。 对于第一种形式,Clang 警告忽略的属性,因为它应用于类型。
在此处查看完整示例: https://godbolt.org/z/qEfEeoqeM 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.