g ++ zeigt keine “unbenutzte” Warnung an

Ich habe ein kleines Stück Code in C ++:

#include  #include  #include  using namespace std; int main() { int i=0; istream_iterator EOS; double x; return 0; } 

Jetzt kompiliere ich es mit meinem g ++ (GCC) 4.4.4

 g++ -W -Wall -pedantic test.cc -o test 

Und bekomme:

 test.cc: In function 'int main()': test.cc:9: warning: unused variable 'i' test.cc:11: warning: unused variable 'x' 

Warum gibt es keine Warnung für unbenutzte EOS?

Es ist kein primitiver Wert, daher haben Konstruktor und / oder Destruktor die gewünschten Nebenwirkungen.

Um zu verdeutlichen, dass dies in der Praxis passiert: Ich verwende eine class, um Abschnitte des Codes zu testen, die ungefähr so ​​aussehen:

 class Timed { double start; public: Timed() { start = now(); } ~Timed() { std::cout < < (now() - start) << '\n'; } } 

Um zu messen, wie lange eine function dauert, mache ich einfach:

 void slow() { Timed t; // heavy operation here... } 

Die Variable t nie verwendet, aber sie ist immer noch wichtig für das Verhalten des Codes.

istream_iterator hat einen Konstruktor, also ist die Deklaration von EOS nicht wirklich ein No-Op wie die Deklarationen von i und x sind.

Oft möchten Sie ein klassenartiges Objekt deklarieren und dann nichts damit anfangen. Betrachten Sie beispielsweise std::lock_guard in C ++ 0x ( boost::scoped_lock in Boost) oder jede andere Art von boost::scoped_lock für den Gültigkeitsbereich. Normalerweise möchten Sie nichts mit einem Objekt dieser Art machen. Sie möchten das Objekt nur so erstellen, dass sein Destruktor am Ende des Blocks ausgeführt wird, um die erforderliche Säuberung durchzuführen.

Weil du das mit einem Ziel gemacht hättest. Es ist kein Primitiv. Vielleicht machen Konstruktor und Destruktor etwas Wichtiges?

MFC hatte sogar classn, die auf diese Weise funktionierten, du könntest das tun:

 void foo() { CWaitCursor cursor; [...] } 

Das würde ein Sanduhr-Symbol für die Dauer der function anzeigen.