std::ignore 用于忽略未使用的变量

新手上路,请多包涵

使用 std::ignore 忽略未使用的变量是一种好方法吗?

假设我有这样的功能:

 void func(int i)
{
   //for some reason, I don't need i anymore but I cannot change signature of function
   std::ignore = i;
}

附加信息

这是一个例子,一些答案建议使用 匿名 变量。但是对于其他情况,我该怎么做,例如:

 int Thread_UnSafe_func_returnSomething():
void func()
{
   // To make it thread safe
   // Also it is required to call only once
   static int i = Thread_UnSafe_func_returnSomething();

   std::ignore = i;
}

原文由 gaurav bharadwaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

std::ignore 可能有效,但它旨在用于元组。因此,您需要包含元组标头以及谁知道为分配完成了哪些操作。这也可能会在另一个 c++ 版本中中断,因为它从未被记录为以这种方式使用。

一个更好的方法是 C++17 属性 [[maybe_unused]]

 void func([[maybe_unused]] int i)
{
}

它将声明放在变量声明中,因此您不必在额外的行/语句中声明它。

同样可以用于局部(和局部静态)变量

...
[[maybe_unused]] static int a = something();
...

还有更多:

出现在类、typedef、变量、非静态数据成员、函数、枚举或枚举数的声明中。如果编译器对未使用的实体发出警告,则对于声明为 may_unused 的任何实体都会抑制该警告。

请参阅 http://en.cppreference.com/w/cpp/language/attributes

至于那些声明变量未使用后仍然可以使用的人:

是的,这是可能的,但是(至少使用 clang)如果您使用 maybe_unused 声明的变量,您会收到警告。

原文由 Hayt 发布,翻译遵循 CC BY-SA 3.0 许可协议

std::ignore 不打算用于此目的:

一个未指定类型的对象,这样任何值都可以分配给它而不会产生任何影响。用于在解包 std::tuple 时与 std::tie 一起使用,作为未使用参数的占位符。


我建议你 不要 做你想做的事,因为在现实世界的大项目中,它会导致代码更难维护,人们会查看函数的原型,会看到它需要一个参数 int i ,但该功能实际上不需要它 - 感觉不太好,是吗? :)

原文由 gsamaras 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题