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

2024-01-26

以下是最小的工作示例(好吧,实际上它是最小的非工作示例:-))。当使用 gcc(从版本 5.0 到 9.3)编译时,它会发出以下警告。它甚至似乎只在发布版本中发出警告(-02及更高)。

Code:

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 or -O0)与较旧的 gcc 版本。

您能看到代码中有什么不正确的地方吗?还是这确实是编译器问题?

观察

当我向 A 类添加删除的复制构造函数时(A(const A&) = delete;),警告消失并且编译器停止创建局部变量。

Try你可以试穿gcc.godbolt.org https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(fontScale:14,j:1,lang:c%2B%2B,selection:(endColumn:3,endLineNumber:3,positionColumn:3,positionLineNumber:3,selectionStartColumn:3,selectionStartLineNumber:3,startColumn:3,startLineNumber:3),source:'class+A%0A%7B%0A%7D%3B%0A%0Aclass+B%0A%7B%0A%09const+A%26+getA()+const%0A%09%7B%0A%09%09static+A+a%3B%0A%09%09return+a%3B%0A%09%7D%0A%09const+A%26+get(bool+b)+const%3B%09%0A%7D%3B%0A%0Aconst+A%26+B::get(bool+b)+const%0A%7B%0A%09return+static_cast%3Cconst+A%26%3E(b+%3F+getA()+:+getA())%3B%0A%7D%0A%0Aint+main(int+argc,+char**+argv)%0A%7B%0A++++return+0%3B%0A%7D%0A'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:47.14654580796961,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g510,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'1',trim:'1'),fontScale:14,j:1,lang:c%2B%2B,libs:!(),options:'-O3',selection:(endColumn:12,endLineNumber:6,positionColumn:12,positionLineNumber:6,selectionStartColumn:12,selectionStartLineNumber:6,startColumn:12,startLineNumber:6),source:1),l:'5',n:'0',o:'x86-64+gcc+5.1+(Editor+%231,+Compiler+%231)+C%2B%2B',t:'0')),k:16.805462296066587,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compiler:1,editor:1,fontScale:14,wrap:'1'),l:'5',n:'0',o:'%231+with+x86-64+gcc+5.1',t:'0')),k:36.04799189596379,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce

随机推荐

  • 如果存在具有相同名称的方法的 Mixin,如何调用超类方法

    重复方法行为 The 代码 这里作为要点 https dartpad dartlang org 10e4a4fe0cc01c7eb5ec926ff9a4cebb将打印e 如果我删除覆盖 即删除output from Baz 它将打印w fr
  • Java PBEWithMD5AndDES

    我正在使用基于密码的加密 我最初的想法是使用 AES 来加密包含密码的文件 结果基于密码的加密不支持 AES 它使用 DES AFAIK des 并不安全 PBEWithMD5AndDES 是否足够安全 足以推送我的数据 还是我应该寻找其他
  • 检查共享目录权限 - C#

    我想编写一段代码来检查共享目录权限 我检查了多个解决方案 但在尝试获取本地目录权限时效果很好 但当我为共享目录制作测试用例时它会失败 我在这个问题中尝试举例 SOF 检查网络中的目录和文件写入权限 https stackoverflow c
  • 寻找最短路径时,广度优先搜索如何工作?

    我做了一些研究 我似乎遗漏了这个算法的一小部分 我了解广度优先搜索的工作原理 但我不明白它到底如何让我到达特定路径 而不是仅仅告诉我每个单独的节点可以去哪里 我想解释我的困惑的最简单方法是提供一个例子 举例来说 假设我有一个这样的图表 我的
  • 在 Heroku 上,rake db:migrate 失败并显示“数据库配置未指定适配器”

    我已经按照导轨教程 http ruby railstutorial org chapters a demo app version 3 2 sec 3adeploying the demo app直到链接点 这是外壳输出 jrhorn424
  • 如何每三个字符插入一个空格,直到一个句点字符?

    我一直在尝试将输入格式设置为每三个字符有一个空格 直到句点字符 例如 999999999 gt 999 999 999 33333 25 gt 33 333 25 222 32 gt 222 32 4444 gt 4444 这是我到目前为止
  • 在 Beaglebone 中使用 openCV 编译 C++ 代码

    我用 C 编写了以下代码 使用 openCV 在 Beaglebone 中运行 include
  • Javascript 模块中的变量在其外部可见吗?

    首先 我来自 NET 世界 那里有静态类 C 在 VB 中也称为模块 和实例类 您可以实例化它们 这个问题是关于 Javascript 的 我试图重新创建我已经知道的模式并创建一个模块 静态类 这是代码 var MyModule varia
  • 重用需要“resolve”参数的“ui-route”控制器

    我希望能够重复使用我的ui router 有线控制器 他们目前从以下位置接收参数ui router resolve渲染他们的模板 我可以重复使用这些控制器吗 ui router 例如 我这样做ui router controller Det
  • Python3中的mimetools.choose_boundary函数在哪里?

    我目前想在Python3中使用以下代码 但发现该函数mimetools choose boundary要弃用 如何更改代码并使其正常工作 import re from urllib request import urlopen Reques
  • Guice JPA - “此连接已关闭。”错误

    在数据库断开空闲连接或数据库关闭并备份后 我在我的网络应用程序中收到以下错误 javax persistence PersistenceException org hibernate exception JDBCConnectionExce
  • async.mapLimit 与 Promise

    我正在尝试使用 async 模块 v3 尤其是 async mapLimit 方法来提交有限数量的并行异步请求 这与以下 简化的 示例代码中的回调配合使用效果很好 async require async async mapLimit 1 2
  • 如何使用用户脚本覆盖警报功能?

    现场有这样的代码 其站点位于 LAN 上 我尝试使用 GM 禁用该警报 我正在尝试这样做 unsafeWindow alert function 但我看到警报并收到此错误 Error uncaught exception Exception
  • Python 3 网页抓取选项

    我是 Python 新手 所以如果这是一个新手问题 我很抱歉 我正在尝试构建一个涉及网络抓取的程序 我注意到 Python 3 的网络抓取模块似乎比 Python 2 x 系列少得多 Beautiful Soup mechanize 和 s
  • 如何在 Android 中为 Fragment 设置标签

    我查看了 Stackoverflow 上的所有问题 但找不到这个问题的唯一明确答案 你怎么将标签设置为Fragment这样你就可以通过以下方式检索它getFragmentManager findFragmentByTag 有人可以给出一个简
  • 保存为 .ps/.eps 时 Matplotlib 绘图失去透明度

    如果我尝试使用 ps eps 扩展名保存一些带有透明椭球体的绘图 我会遇到问题 Here s the plot saved as a png If I choose to save it as a ps eps here is what i
  • 为什么我不能在 python3 中子类化元组?

    让我们先说一下这个问题你应该使用 new 代替 init 用于子类化不可变对象 https stackoverflow com questions 399022 why cant i subclass datetime date 话虽如此
  • webGL 中的平面着色

    我正在尝试在 webgl 中实现平面着色 我知道varying顶点着色器中的关键字将对该值进行插值并将其传递给片段着色器 我正在尝试禁用插值 我发现flat关键字可以做到这一点 但似乎不能在 webgl 中使用 flat varying v
  • 从 TensorArray 到 Tensor

    给定一个具有固定大小的 TensorArray 和具有统一形状的条目 我想通过将 TensorArray 的索引维度作为常规轴来获取包含相同值的 Tensor TensorArrays 有一个名为 gather 的方法 据称它应该可以做到这
  • 意外的 gcc 警告:函数返回局部变量的地址 - 这是编译器错误吗?

    以下是最小的工作示例 好吧 实际上它是最小的非工作示例 当使用 gcc 从版本 5 0 到 9 3 编译时 它会发出以下警告 它甚至似乎只在发布版本中发出警告 02及更高 Code class A class B const A getA