6

私はこの例をコンパイルするためにg++4.3.0を使用しています:

#include <vector>

int main()
{
  std::vector< int > a;
  int b;
}

最大警告レベルで例をコンパイルすると、変数bが使用されていないという警告が表示されます。

[vladimir@juniper data_create]$ g++ m.cpp -Wall -Wextra -ansi -pedantic
m.cpp: In function ‘int main()’:
m.cpp:7: warning: unused variable ‘b’
[vladimir@juniper data_create]$

問題は、変数aが未使用として報告されないのはなぜですか?変数aの警告を取得するには、どのパラメーターを渡す必要がありますか?

4

3 に答える 3

23

理論的には、のデフォルトコンストラクターにstd::vector<int>は任意の副作用がある可能性があるため、コンパイラーは、の定義を削除するaとプログラムのセマンティクスが変更されるかどうかを判断できません。これらの警告は、組み込みタイプに対してのみ表示されます。

より良い例はロックです:

{
    lock a;
    // ...
    // do critical stuff
    // a is never used here
    // ...
    // lock is automatically released by a's destructor (RAII)
}

定義後に使用されることはありませaんが、最初の行を削除するのは間違いです。

于 2010-11-01T16:26:03.820 に答える
1

aは組み込み型ではありません。実際には、のコンストラクターを呼び出してstd::vector<int>、結果をに割り当てています。コンストラクターには副作用がある可能性があるため、コンパイラーはこれを使用法と見なします。

于 2010-11-01T16:28:56.013 に答える
1

aは、スコープの最後でデストラクタが呼び出されたときに宣言された後に実際に使用されます。

于 2010-11-01T16:47:21.153 に答える