意外的gcc警告:函数返回局部变量的地址-这是编译器错误吗?

以下是最小的工作示例(好的,实际上,这是最小的不工作示例:-)。使用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

iCMS 回答:意外的gcc警告:函数返回局部变量的地址-这是编译器错误吗?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2152893.html

大家都在问