1

C++17 支持[[nondiscard]]函数类(结构)和枚举的属性。

以下定义编译(g ++ 7.4.0)而不产生“警告:'nondiscard'属性指令被忽略” - 所以我假设该[nondiscard]]属性没有被忽略。

enum {False=false, True=true} [[nondiscard]] ;

但是,当丢弃 False 或 True 值时,它不会产生警告(这是这里的目标)。

==== 编辑 ====

该问题的更多上下文以及:如何制作 nodiscard MACRO(用于类或枚举值)。

我发布的原始问题存在三个问题:

  1. 多么尴尬 - 我写了 [[nondiscard]] io [[nodiscard]]
  2. 当属性中存在拼写错误时,编译器通常会发出警告(属性被忽略),但在这种情况下不会发出警告。
  3. 将其更正为 [[nodiscard]] 仍然不起作用。
  4. 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);
}
4

1 回答 1

1

将属性放在 enum 关键字及其名称之间:

enum [[nodiscard]] Boolean { False = false, True = true };
于 2019-08-03T00:12:44.710 回答