Как конструктор может вызвать lead Visual Studio 2019 для выдачи предупреждения C26444?

#c

#c

Вопрос:

Лучшее, что я знаю, конструктор имеет тип void. Учитывая код, указанный ниже, почему редактор Visual Studio 2019 помечает указанный вызов конструктора предупреждением C26444?

Вот соответствующий исходный код реализации:

 #pragma once

#include "Class_dB_CG.h"

CG::CG() {}

CG::~CG() {}

CG::CG(const CGamp; rhs) {}

CG::CG(ER* e)

{

CG();       ***//warning on this line***

er = e;

}


**The header file is here:**

#pragma once

#include "Class_dB_ER.h"

class CG

{

private:

ER*   er = 0;

public:

CG();

~CG();

CG(const CGamp; rhs);

CG(ER* e);

};
  

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

1. Я не получаю никаких предупреждений: rextester.com/ZYTKF38159

2. Согласно learn.microsoft.com/en-us/cpp/code-quality/c26444?view=vs-2019 C26444 означает «Неназванные (то есть временные) объекты с нетривиальным поведением могут указывать на … неэффективный код, который выделяет и немедленно выбрасывает ресурсы» Таким образом, вы создаете объект temporart и не присваиваете его переменной, чтобы он немедленно уничтожался.

3. когда вы получаете предупреждение или ошибку в определенной строке столбце, это означает, что проблема находится на этой позиции или перед ней. В вашем случае это, вероятно, перед этой строкой (в типе ER)

4. пожалуйста, укажите содержимое «Class_dB_ER.h»

Ответ №1:

В этом коде:

 CG::CG(ER* e)
{ 
  CG(); // warning on this line
  er = e;
}
  

вы не вызываете конструктор. Вы просто создаете временный объект, который отбрасывается. Вероятно, это то, на что ссылается предупреждение.

Если вы хотите вызвать конструктор, вы можете сделать это следующим образом:

 CG::CG(ER* e) : CG()
{
  er = e;
}
  

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

1. не согласен с вами. Но при использовании ER в качестве псевдонима для int предупреждения нет. Предупреждение должно иметь какое-то отношение к типу ER (который мы не знаем)

2. @engf-010 Упс, я пытался int и забыл изменить его обратно на ER . Исправлено, спасибо. Я бы сказал, что это должно быть предупреждение независимо от того, что ER это такое.

3. тем не менее, предупреждение должно исходить из ER

4. полностью согласен. но OP получает предупреждение, а я нет. что заставляет меня задуматься, что находится в ER.

5. ОК. Итак, конструкция, которую я дал, является ошибкой в синтаксисе.