I am using g++ 4.3.0 to compile this example :
#include <vector>
int main()
{
std::vector< int > a;
int b;
}
If I compile the example with maximum warning level, I get a warning that the variable b is not used :
[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]$
The question is : why the variable a is not reported as not used? What parameters do I have to pass to get the warning for the variable a?
In theory, the default constructor for
std::vector<int>
could have arbitrary side effects, so the compiler cannot figure out whether removing the definition ofa
would change the semantics of the program. You only get those warning for built-in types.A better example is a lock:
Even though
a
is never used after its definition, removing the first line would be wrong.a is actually used after it is declared as its destructor gets called at the end of its scope.
a is not a built-in type. You are actually calling the constructor of
std::vector<int>
and assigning the result to a. The compiler sees this as usage because the constructor could have side effects.