繁体   English   中英

如何标记constexpr函数的参数未使用?

[英]How to mark a constexpr function's parameter unused?

考虑这个经典的例子:

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept { return N; }

现在这个工作正常,但有一个烦恼, gcc发出警告:

warning: unused parameter ‘array’ [-Wunused-parameter]

已知解决方案:

  • 不起作用:如果我添加经典(void)arr; 对函数,我得到error: body of constexpr function '...' not a return-statement
  • 不满意:我可以有arraySize(T (&)[N]) ,但我想命名参数有两个原因:
    1. 它使编译器错误消息更容易理解。
    2. 更主观地说,我认为它使代码更清晰,特别是那些没有生活和呼吸语法的人。
  • 不好:在这个特定的例子中,我还可以return sizeof(array)/sizeof(array[0]); ,但这种方法不是普遍的解决方案,而且我认为还有return N; 更好,在眼睛上肯定更容易。
  • 好但不总是可能:切换到使用C ++ 14和完全支持它的编译器。 然后constexpr函数体就像{ (void)array; return N; } { (void)array; return N; } { (void)array; return N; }是允许的。

在使用C ++ 11时,如何很好地消除未使用的参数警告

试试这个。 我有时会使用这种方法

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (& /*array*/ )[N]) noexcept { return N; }

我建议使用以下(ab)逗号运算符:

return (void)array, N;

对于新的googlers:

C ++ 17添加了[[maybe_unused]]属性,可以像这样使用:

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N] [[maybe_unused]]) noexcept { return N; }

最好的解决方案是禁止使用第二个点,即使用T(&)[N]

另一种可能的方法,如注释,是使用以下返回值:

return array ? N : N;

我很确定编译器会摆脱它,并且在运行时不会出现性能问题。

正如@ fnc12和@skypjack都指出的那样,沉默未使用的参数编译器警告的惯用方法是不给参数命名。

constexpr std::size_t arraySize(T (& /*array*/ )[N]) noexcept { return N; }

使用/**/ comments解决了可读性异议。 它没有在编译器消息中修复名称,但我认为最可能出现的情况是“未声明的标识符”,一旦您注意到标识符被注释,这很容易解决。

如果您真的死于惯用方式,那么只需抑制警告(如果您的编译器允许,则在本地)。

使用#pragma GCC diagnostic抑制GCC中的警告

使用#pragma warning suppress在Visual Studio中抑制警告

我建议不要在代码中添加“虚拟”引用来关闭编译器。 无缘无故地引用一个未使用的参数而不是抑制编译器警告会不必要地增加代码的复杂性,并且可能会使未来的维护者混淆为什么会出现这种情况。

未命名的论证是正确的解决方案。

所以你可以使用中间函数:

template <typename T>
constexpr void avoid_warning_for_unused_parameter(T&&) noexcept{}

然后:

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept
{
    avoid_warning_for_unused_parameter(array);
    return N;
}

对于C ++ 11,你不得不破解:

template <typename... Ts>
constexpr auto return_first_and_avoid_warning_for_unused_parameters(T&&t, Ts&&) noexcept
-> decltype(t)
{
    return t;
}

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept
{
    return return_first_and_avoid_warning_for_unused_parameters(N, array);
}

gcc提供了未使用的属性 ,可以按如下方式使用:

constexpr std::size_t arraySize(__attribute__((unused)) T (&array)[N]) noexcept { return N; }
                                ^^^^^^^^^^^^^^^^^^^^^^^

Ben Deane最近讨论了一种使用lambdas抑制此警告的C ++ 11方法 ,结合逗号运算符看起来像这样:

#define UNUSED(x) [&x]{}()

//...

return UNUSED(array), N;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM