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

C++ 意外的gcc警告:函数返回局部变量的地址-是编译器错误吗?,c++,gcc,gcc-warning,compiler-bug,C++,Gcc,Gcc Warning,Compiler Bug,下面是最小的工作示例(好的,事实上这是最小的非工作示例:-))。当使用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&

下面是最小的工作示例(好的,事实上这是最小的非工作示例:-))。当使用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
A类
{
};
B类
{
常量A&getA()常量
{
静态A;
返回a;
}
常量A和获取(布尔b)常量;
};
常量A&B::获取(布尔B)常量
{
返回静态_cast(b?getA():getA());
}
int main(int argc,字符**argv)
{
返回0;
}
编译器输出:

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
:在成员函数“const A&B::get(bool)const”中:
:17:50:警告:函数返回局部变量[-Wreturn local addr]的地址
返回静态_cast(b?getA():getA());
:17:50:注:此处声明
返回静态_cast(b?getA():getA());
编译器返回:0
上面的代码可以用MSVC和clang编译,甚至可以用GCC10.1编译。它还使用较旧的gcc版本编译调试中的ok(使用
-O1
-O0

你能看到代码中有什么不正确的地方吗?或者这真的是编译器的问题吗

观察

当我将一个已删除的复制构造函数添加到类a(
a(const a&)=delete;
)时,警告消失,编译器停止创建局部变量

试试看
你可以试试

为什么使用GCC来C++?@ DaviG.PikETT为什么不呢?看起来这是假阳性警告。看起来它已经在gcc 10中修复了。@eerorika这不是误报,如果您查看生成的代码,它是不正确的。即使使用<代码> -O0<代码>,生成的代码也返回无效引用。如果删除<代码> STATICORCAST 它似乎具有预期的行为。为什么使用GCC来C++?@ DavID.PkeTeT为什么不呢?看起来这是假阳性警告。看起来它已经在gcc 10中修复了。@eerorika这不是误报,如果您查看生成的代码,它是不正确的。即使使用
-O0
生成的代码也会返回一个无效的引用。如果删除
静态\u cast
,它似乎具有预期的行为。