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

Существуют ли сценарии, в которых предупреждение C4172 Visual С++ не должно считаться ошибкой?

C4172 Предупреждение Visual С++ для случаев, когда функция возвращает адрес локальной или временной или ссылку на локальную переменную.

Что-то вроде этого:

int& fun()
{
    int var;
    return var; //C4172
}

Теперь выглядит хорошая идея использовать #pragma warning, чтобы Visual С++ рассматривал C4172 как компиляцию с ошибкой и разбиением.

Существуют ли разумные сценарии, где C4172 на самом деле не является ошибкой?

4b9b3361

Ответ 1

Я не уверен, почему кто-нибудь захочет это сделать:

int * stackTester()
{
    int dummy;
    return &dummy;
}

bool stackGoesUp()
{
    int dummy;
    return stackTester() > &dummy;
}

Но, вообще говоря, вы должны относиться к предупреждению как к ошибке.

Ответ 2

Это предупреждение уровня 1, очень трудно игнорировать. Но компилятор здесь следит за языковыми стандартами, а вызов UB запрещен. И это очень распространенная ошибка, которая слишком часто подходит к концу. Расположение наложенного стека остается стабильным, пока вы не совершаете никаких вызовов функций.

Лучший способ справиться с этим - всегда включать предупреждения в ошибки. Скомпилируйте с /WX, "Удовольствие предупреждений как ошибки" в среде IDE. Если вы тогда намеренно хотите подавить предупреждение, то предупреждение #pragma дает понять всем, что происходит что-то подозрительное, о котором думали, а не о несчастном случае.

Ответ 3

Неиспользуемый код

class base
{
   virtual blah& makeBlah() 
}

class red : public base
{
    blah& makeBlah() { return blah(); } // there are no red blahs, never called
}

class blue : public base
{
    blah& makeBlah() { actual code to make a blah }
}