Подтвердить что ты не робот

G++ не показывает "неиспользуемое" предупреждение

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

#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?

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

void foo()
{
    CWaitCursor cursor;

    [...]
}

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