我使用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 的警告?
答案 0 :(得分: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
在定义后从未使用过,但删除第一行也是错误的。
答案 1 :(得分:1)
a不是内置类型。您实际上正在调用std::vector<int>
的构造函数并将结果分配给a。编译器将此视为用法,因为构造函数可能有副作用。
答案 2 :(得分:1)
a实际上是在声明它之后使用的,因为它的析构函数在其作用域的末尾被调用。