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

hyd*_*yde 5 c++ constexpr c++11

考虑这个经典的例子:

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

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

warning: unused parameter ‘array’ [-Wunused-parameter]
Run Code Online (Sandbox Code Playgroud)

已知解决方案:

  • 不起作用:如果我将经典添加(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和完全支持它的编译器.然后{ (void)array; return N; }允许constexpr函数体.

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

fnc*_*c12 5

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

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

  • 您是否阅读了@skypjack 的问题或答案? (2认同)

ted*_*ted 5

对于新的谷歌用户:

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

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


The*_*ant 4

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

return (void)array, N;
Run Code Online (Sandbox Code Playgroud)