Что касается фактического кода в вашем вопросе: никакие временные объекты не создаются, потому что ваши max
и operator+
принимают свои аргументы и возвращают свои результаты по ссылке. Таким образом, код действительно действителен (если он странный / вводящий в заблуждение).
Однако, если мы упростим ваш код до версии, которая фактически содержит ошибку:
struct A
{
static int &foo(int &x)
{
int a = 42;
return x < a ? x : a;
}
};
int main()
{
int n = 0;
return A::foo(n);
}
... мы все еще не получаем предупреждение, по крайней мере, с g ++ 8.3.1.
Похоже, это связано с тем, что foo
является функцией-членом и / или помечен static
. Без обертки класса:
static int &foo(int &x)
{
int a = 42;
return x < a ? x : a;
}
int main()
{
int n = 0;
return foo(n);
}
... предупреждения до сих пор нет.
Аналогично, без static
:
struct A
{
int &foo(int &x)
{
int a = 42;
return x < a ? x : a;
}
};
int main()
{
A wtf;
int n = 0;
return wtf.foo(n);
}
... предупреждения тоже нет.
но без класса и static
:
int &foo(int &x)
{
int a = 42;
return x < a ? x : a;
}
int main()
{
int n = 0;
return foo(n);
}
.code.tio.cpp: In function ‘int& foo(int&)’:
.code.tio.cpp:4:24: warning: function may return address of local variable [-Wreturn-local-addr]
return x < a ? x : a;
^
... как и ожидалось.
Я подозреваю, что это ошибка / недосмотр в g ++.
Компиляторы на самом деле не обязаны предупреждать о плохом коде, но, к сожалению, довольно очевидный случай неработающего кода не диагностируется.