Предупреждение: локальная переменная без ссылок

#c

#c

Вопрос:

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

 class A
{
public:
   A() {}
};

int main()
{
   A a;
}
  

Комментарии:

1. Какой компилятор вы используете?

2. @Jacob: Компилятор VC с флагом предупреждения: /W3

Ответ №1:

Это всего лишь теория, но поскольку конструктор может содержать код, который может вызывать побочные эффекты, кто-то может решить создать неиспользуемый объект просто для запуска этого кода. Если у вас нет конструктора и вы никогда не ссылаетесь на созданный вами объект, то можно с уверенностью определить, что у объекта нет назначения.

Комментарии:

1. @Muggen: «Это всего лишь теория …»

2. Это только теория, но она имеет логический смысл. Было бы интересно взглянуть на исходный код компилятора (если это компилятор с открытым исходным кодом, который использует OP)

3. Компилятор Visual C (который, как я предполагаю, использует OP на основе текста предупреждения) не является открытым исходным кодом, но ваше объяснение имеет наибольший смысл. В официальной документации говорится, что добавление конструктора «отключит» предупреждение в этом конкретном случае.

Ответ №2:

Например, если A есть что-то, что содержит блокировку мьютекса (и снимает блокировку при разрушении), то этот код

 int main()
{
    A a;
    // other actions
}
  

способен поддерживать потокобезопасность этой функции, даже a на которую нет ссылок.