C++17 支持[[nondiscard]]
函数类(结构)和枚举的属性。
以下定义编译(g ++ 7.4.0)而不产生“警告:'nondiscard'属性指令被忽略” - 所以我假设该[nondiscard]]
属性没有被忽略。
enum {False=false, True=true} [[nondiscard]] ;
但是,当丢弃 False 或 True 值时,它不会产生警告(这是这里的目标)。
==== 编辑 ====
该问题的更多上下文以及:如何制作 nodiscard MACRO(用于类或枚举值)。
我发布的原始问题存在三个问题:
- 多么尴尬 - 我写了 [[nondiscard]] io [[nodiscard]]
- 当属性中存在拼写错误时,编译器通常会发出警告(属性被忽略),但在这种情况下不会发出警告。
- 将其更正为 [[nodiscard]] 仍然不起作用。
- Vittorio 的语法有效。
更广泛的背景:
我需要 [[nodiscard]] 在宏 ( #define
) 中工作,因为它使用的是FILENAME;但是, [[nodiscard]] 适用于函数或函数返回的值,而我没有函数,因此 [[nodiscard]] 不起作用。
我终于使用匿名 lambda 函数解决了这个问题,如下面的简化示例所示。
另一种方法是将 [[nodiscard]] 直接应用于 lambda 函数。不幸的是,C++ 不支持(还)[[nodiscard]] 的 lambda 函数。以下 g() 的语法有效
//enum {False=false, True=true} [[nondiscard]] ; // wrong
//enum {False=false, True=true} [[nodiscard]] ; // wrong
enum [[nodiscard]] Boolean { False = false, True = true }; // right
#define f(x) ((x) ? True : False) // wrong
#define g(x) [](int v) {return (v ? True : False);}(x) // right
int main()
{
f(1);
g(1);
}