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

理论上,默认构造函数 forstd::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 实际上是在它被声明为它的析构函数在其作用域的末尾被调用之后使用的。

于 2010-11-01T16:47:21.153 回答
1

a 不是内置类型。您实际上是在调用 a 的构造函数std::vector<int>并将结果分配给 a。编译器将此视为用法,因为构造函数可能有副作用。

于 2010-11-01T16:28:56.013 回答