![](/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.