42

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;
}
4

7 に答える 7

50

std::ignore動作する可能性がありますが、タプルに使用することを意図しています。そのため、タプル ヘッダーを含める必要があり、割り当てに対してどのような操作が行われるかを誰が知っているかを知る必要があります。これは別の C++ バージョンでも壊れる可能性があります。

これに対するより良い方法は、C++17 属性です。[[maybe_unused]]

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

変数宣言のすぐそばに宣言を配置するため、余分な行/ステートメントで宣言する必要はありません。

同じことがローカル(およびローカル静的)変数にも使用できます

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

また、さらに多くの場合:

クラス、typedef、変数、非静的データ メンバー、関数、列挙、または列挙子の宣言に表示されます。コンパイラが未使用のエンティティに対して警告を発行する場合、その警告は、maybe_unused と宣言されたエンティティに対して抑制されます。

http://en.cppreference.com/w/cpp/language/attributesを参照してください

変数を未使用と宣言した後も変数を使用できることを心配している人々については、次のとおりです。

はい、可能ですが (少なくとも clang では)maybe_unused宣言された変数を使用すると警告が表示されます。

于 2016-09-28T11:20:21.860 に答える
46

そのような場合、変数名を書かないでください:

void func(int /*i*/)
{
    ...
}

@Haytの答えは良いですが、常に利用できるとは限らない最新バージョンのC++を使用しています。変数名を書かないことは、実際には変数が必要ないことをコンパイラーに伝えるための古い慣例です。

更新された質問については、コンストラクターで初期化が必要なクラスの静的インスタンスを探します。私が初期化と言うのは、そのような関数を持つことができる唯一の理由は、いくつかのグローバル オブジェクトを初期化することだからです。

class SomethingInitializer {
public:
    SomethingInitializer() {
        func_returnSomething();
    }
    ~SomethingInitializer() {
        // Note, that when you initialize something it is a good practice to deinitialize it at the end, and here is a proper place for that.
    }
};

void func() {
    static SomethingInitializer initializer;
}

このソリューションには小さなボーナスがあります。SomethingInitializer は RAII に準拠しています。したがって、アプリケーションが終了すると、デストラクタが呼び出され、初期化を解除できます。

コンパイラは、クラスがコンストラクタとデストラクタで何か役に立つことを知っているので、未使用の変数について文句を言わないことに注意してください。

于 2016-09-28T11:25:06.717 に答える
9

C++17 では、属性[[maybe_unused]]が使用される場合があります。

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

以前は、別の方法として、i署名から削除せずに (ドキュメント ツールによっては削除が必要な場合があるため)、警告を消す方法がいくつかあります。

  • へのキャストvoid:

    void func(int i)
    {
       static_cast<void>(i); // Silence warning for unused variable
    }
    

    完全に移植できるわけではありませんが、ほとんどのコンパイラで警告が抑制されます。

  • 「クリーンな」方法は、専用の関数を作成することです。

    template <typename T>
    void Unused(T&& /*No name*/) { /*Empty*/ }
    

    その後

    void func(int i)
    {
       Unused(i); // Silence warning for unused variable
    }
    
于 2016-09-28T11:59:23.200 に答える
2

ここにXYの問題があると思います。静的変数を無視する方法はあまり気にしません。スレッドセーフで再入可能な方法で関数を 1 回 (そして 1 回だけ) 呼び出したいだけです。

私が言うには:あなたは聞いたことがありstd::call_onceますか?メソッドを次のように書き換える必要があります。

#include <mutex>

int Thread_UnSafe_func_returnSomething();
void func(void)
{
      //To make it thread safe
     static std::once_flag initComplete;
     std::call_once(initComplete, func_returnSomething);
 }
于 2016-09-28T16:14:02.387 に答える