Ниже приведен минимальный рабочий пример (хорошо, на самом деле это минимальный нерабочий пример :-)). При компиляции с помощью gcc (с версии 5.0 до 9.3) выдается следующее предупреждение. Кажется, даже предупреждение выдается только в релизной сборке (-02
и выше).
Код:
class A
{
};
class B
{
const A& getA() const
{
static A a;
return a;
}
const A& get(bool b) const;
};
const A& B::get(bool b) const
{
return static_cast<const A&>(b ? getA() : getA());
}
int main(int argc, char** argv)
{
return 0;
}
Вывод компилятора:
<source>: In member function 'const A& B::get(bool) const':
<source>:17:50: warning: function returns address of local variable [-Wreturn-local-addr]
return static_cast<const A&>(b ? getA() : getA());
<source>:17:50: note: declared here
return static_cast<const A&>(b ? getA() : getA());
Compiler returned: 0
Приведенный выше код нормально компилируется как с MSVC, так и с clang, и даже с gcc 10.1. Он также нормально компилируется в режиме отладки (с -O1
или -O0
) со старыми версиями gcc.
Вы видите что-то неправильное в коде, или это действительно проблема компилятора?
Наблюдение
Когда я добавляю конструктор удаленной копии в класс A (A(const A&) = delete;
), предупреждение исчезает, и компилятор останавливается для создания локальной переменной.
Попробуйте Вы можете попробовать gcc.godbolt.org
-O0
сгенерированный код возвращает недопустимую ссылку. - person IlCapitano   schedule 11.06.2020static_cast
, похоже, это будет ожидаемое поведение. - person IlCapitano   schedule 11.06.2020static_cast
должна вызывать какие-либо проблемы:/. - person Mi-La   schedule 11.06.2020