Переменная не обнаружена как не использованная - PullRequest
6 голосов
/ 01 ноября 2010

Я использую g ++ 4.3.0 для компиляции этого примера:

#include <vector>

int main()
{
  std::vector< int > a;
  int b;
}

Если я скомпилирую пример с максимальным уровнем предупреждения, я получу предупреждение, что переменная b не используется:

[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]$

Вопрос в том, почему переменная a не указывается как не использованная? Какие параметры мне нужно передать, чтобы получить предупреждение для переменной a ?

Ответы [ 3 ]

23 голосов
/ 01 ноября 2010

Теоретически, конструктор по умолчанию для std::vector<int> может иметь произвольные побочные эффекты, поэтому компилятор не может определить, изменит ли семантика программы удаление определения a. Вы получаете эти предупреждения только для встроенных типов.

Лучшим примером является блокировка:

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

Даже если a никогда не используется после его определения, удаление первой строки будет неправильным.

1 голос
/ 01 ноября 2010

a фактически используется после того, как объявлено, поскольку его деструктор вызывается в конце своей области видимости.

1 голос
/ 01 ноября 2010

a не является встроенным типом.Вы на самом деле вызываете конструктор std::vector<int> и присваиваете результат a.Компилятор видит это как использование, потому что конструктор может иметь побочные эффекты.

...