以下是最小的工作示例(好的,实际上,这是最小的不工作示例:-)。使用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正常编译。它还可以在较早的gcc版本中以ok(在-O1
或-O0
的情况下)编译。
您能在代码中看到任何不正确的地方吗,还是真的是编译器问题?
观察
当我将删除的副本构造函数添加到类A(A(const A&) = delete;
)时,警告消失,编译器停止创建局部变量。
尝试 您可以尝试gcc.godbolt.org