C++ 未检测为未使用的变量

C++ 未检测为未使用的变量,c++,gcc,g++,gcc-warning,C++,Gcc,G++,Gcc Warning,我正在使用g++4.3.0编译此示例: #include <vector> int main() { std::vector< int > a; int b; } 问题是:为什么变量a未报告为未使用? 要获得变量a的警告,我必须传递哪些参数?理论上,std::vector的默认构造函数可能具有任意副作用,因此编译器无法确定删除a的定义是否会改变程序的语义。您只会收到内置类型的警告 更好的示例是锁: { lock a; // ... //

我正在使用g++4.3.0编译此示例:

#include <vector>

int main()
{
  std::vector< int > a;
  int b;
}
问题是:为什么变量a未报告为未使用?
要获得变量a的警告,我必须传递哪些参数?

理论上,
std::vector
的默认构造函数可能具有任意副作用,因此编译器无法确定删除
a
的定义是否会改变程序的语义。您只会收到内置类型的警告

更好的示例是锁:

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

即使
a
在定义后从未使用过,删除第一行也是错误的。

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

a在其作用域结束时被声明为其析构函数并被调用后实际使用。

某些GCC代码分析警告仅起作用(或效果更好),如果您也使用优化,请尝试使用-O2或-O3@Laurynas我认为答案是正确的。优化级别在这种情况下不起任何作用(当然我试过了)。非常好的答案/示例。不久前,当我向客户解释相同的概念时,我使用了一个类似的例子。客户和我针锋相对,认为“锁a”会被优化掉,因为它“没有被使用”。我解释说它保证不会被消除(构造函数/析构函数-互斥体获取/释放的副作用)。我记得,我最终不得不在《标准》中找到支持我观点的章节。将尝试查找并发回。
{
    lock a;
    // ...
    // do critical stuff
    // a is never used here
    // ...
    // lock is automatically released by a's destructor (RAII)
}