G ++ не показывает «неиспользованное» предупреждение - PullRequest
21 голосов
/ 14 марта 2011

У меня есть небольшой кусочек кода на C ++:

#include <iostream>
#include <iterator>
#include <string>

using namespace std;

int main() {

    int i=0;
    istream_iterator<string> EOS;
    double x;

    return 0;
}

Теперь я скомпилировал его с моим g ++ (GCC) 4.4.4

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

И получил:

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

Почему нет предупреждения о неиспользованном EOS?

Ответы [ 3 ]

32 голосов
/ 14 марта 2011

Это не примитивное значение, поэтому его конструктор и / или деструктор могут иметь желаемые побочные эффекты.

Чтобы проиллюстрировать, что это происходит на практике: я использую класс для определения временных отрезков кода, который выглядит примерно так:

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

Итак, чтобы измерить, сколько времени займет функция, я просто делаю:

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

Переменная t никогда не используется, но она по-прежнему важна для поведения кода.

6 голосов
/ 14 марта 2011

istream_iterator<string> имеет конструктор, поэтому объявление EOS на самом деле не является запретом, как объявления i и x.

Часто вы хотите объявитьОбъект типа класса, а затем ничего не делать с ним.Например, рассмотрим std::lock_guard в C ++ 0x (boost::scoped_lock в Boost) или любой другой класс защиты области видимости.Обычно вы не хотите ничего делать с такими объектами, вы просто хотите создать объект, чтобы его деструктор запускался в конце блока, чтобы выполнить любую необходимую очистку.

2 голосов
/ 14 марта 2011

Потому что вы могли бы сделать это с целью. Это не примитив. Может быть, конструктор и деструктор делают что-то важное?

MFC даже имел классы, которые работали таким образом, вы могли бы сделать это:

void foo()
{
    CWaitCursor cursor;

    [...]
}

Это будет отображать значок песочных часов в течение всей функции.

...