簡體   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