使用 C++0x decltype 返回值时返回局部变量或临时变量的地址

2024-04-07

Edit:

这确实是编译器的一个bug,我开了一个defect https://connect.microsoft.com/VisualStudio/feedback/details/573330/bad-code-generated-for-function-using-a-decltype-return-value?wa=wsignin1.0#details并得到以下回应。

你好莫蒂,
感谢您提交此问题。正如 stackoverflow 帖子中所述,这是我们 decltype 实现中的一个错误。不幸的是,我们无法在 Visual Studio 的下一版本中修复此错误,因为代码相对不常见,而且我们的资源特别有限。

原问题如下


我正在尝试 VS10 的 C++0x 功能,遇到了以下问题。

std::map<int, int> map()
{
    return std::map<int, int>();
}

template <class F>
auto call(F f) -> decltype(f())
{       
    auto ret = f();
    return ret;
}

void check() 
{
    auto m = call(map); 
}

我收到以下警告:

警告 C4172:返回局部变量或临时变量的地址

但是当我改变原型时call成为旧风格:

std::map<int, int> call(F f)

没关系,什么时候也可以call不是模板函数(即使使用推导的返回类型)。

如果我看一下类型ret it's std::map<int, int>(没有引用或指针)。

这是 VS10 中的错误还是我遗漏了一些东西。


call(map);隐式将 map 转换为函数指针,以使该函数:

auto call( std::map<int,int>(*f)() ) -> decltype(f())

看起来 VC10 不符合 decltype 的 c++0x FCD,其中表示:

decltype(e) 表示的类型定义如下:

  • 如果 e 是不带括号的 id 表达式或类成员访问 [剪断,它不是]

  • 否则,如果 e 是函数调用 (5.2.2) 或 [snip],则 decltype(e) 是静态选择的函数的返回类型;

  • 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;

  • 否则,decltype(e) 是 e 的类型。

5.2.2 明确指出通过函数指针进行调用是“函数调用”,因此decltype(f())应该std::map<int,int>。相反,它将 f() 视为左值表达式,其结果std::map<int,int> &。 ret 的类型被正确推断,但它被返回转换为引用。

当您使用函数表达式而不是函数指针表达式时,不会出现此错误,decltype(map())正确结果为std::map<int,int>.

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

使用 C++0x decltype 返回值时返回局部变量或临时变量的地址 的相关文章

随机推荐

  • C# htmlagilitypack,捕获重定向

    大家好 这真的很简单 我希望 我正在使用 htmlagility pack 进行网络爬虫 那么 如果我输入 url 然后将我定向到新的 url 会发生什么情况 如何捕获该新的重定向 URL 如果 htmlagilitypack 没有办法 有
  • 登录 GCP 和本地

    我正在构建一个旨在在 Google Cloud Platform 中的虚拟机上运行的系统 但是 作为一种备份形式 它也可以在本地运行 话虽这么说 我目前的问题是日志记录 我有两个记录器 都可以工作 一个本地记录器和一个云记录器 云记录器 i
  • 在 FTP 上上传文件

    我想将文件从一台服务器上传到另一台 FTP 服务器 以下是我上传文件的代码 但它抛出错误 远程服务器返回错误 550 文件不可用 例如 未找到文件 无法访问 这是我的代码 string CompleteDPath ftp URL strin
  • 使用贝叶斯优化的深度学习结构的超参数优化

    我为原始信号分类任务构建了 CLDNN 卷积 LSTM 深度神经网络 结构 每个训练周期运行约 90 秒 超参数似乎很难优化 我一直在研究优化超参数的各种方法 例如随机或网格搜索 并发现了贝叶斯优化 虽然我还没有完全理解优化算法 但我认为它
  • Keras model.fit log 和 Sklearn.metrics.confusion_matrix 报告的验证准确性指标彼此不匹配

    问题是报道的validation accuracy我从 Keras 获得的价值model fit历史显着高于validation accuracy我得到的指标sklearn metrics功能 我得到的结果model fit总结如下 Las
  • Java gRPC 服务器用于长寿命流的有效实现

    我想了解 gRPC 框架的一部分 用于长期流的资源管理 假设我们有无限的罕见 每秒一次左右 事件源 我们希望通过 grpc 流的方式将其流式传输到客户端 这些事件由服务器上的单个应用程序线程生成 我看到两种可能的流事件实现 在 rpc 调用
  • 如何在具有复合 PK 的实体中使用“findBy”(Hibernate JPA)

    我正在用 bootspring 学习 findByDate int date 以前一直工作直到我搬家int Date进入内部类 现在我可以保存新条目 但无法按日期检索它们 我需要改变什么 Transactional public inter
  • 在 package:html、dart:html、dart:io(类 HttpClient)和 package:http API 之间进行选择来获取 HTTP 资源

    我意识到目前至少有三个 官方 Dart 库允许我执行 HTTP 请求 更重要的是 其中三个库 dart io 类 HttpClient package http 和 dart html 各自具有不同的 不兼容的 API 截至今天 packa
  • Phonegap - 检测仿真

    Phonegap 应用程序如何确定它是在实际设备上运行还是在模拟设备上运行 我需要一个同时适用于 Android 和 iOS 的解决方案 你有没有看一下设备接口 http docs phonegap com en 3 3 0 cordova
  • 如何编写 mql4 代码 (EA) 用矩形标记列出的蜡烛形态

    我对写作很陌生mql4代码 如果我能在出现以下烛台图案时获得一些绘制矩形的帮助 我将不胜感激 FIG1 Run code snippet blockquote class imgur embed pub a href imgur com a
  • GPU编程简介[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每个人的桌面上都有一台以显卡 GPU 形式存在的巨大的大规模并行超级计算机 GPU 社区的 hello world 相当于什么 我该做什么 去哪
  • CBC 模式下的 HMAC-SHA256 和 AES-256

    我最近遇到以下代码示例 http code activestate com recipes 576980 authenticated encryption with pycrypto 用于使用 AES 256 CBC 和 SHA 256 H
  • 使用 Spring JPA 和 Hibernate 访问 Session 以启用过滤器

    在 Spring JPA Hibernate 环境中 我需要启用 Hibernate 实体过滤器 所以我应该有权访问 Hibernate Session 对象 但我正在使用 EntityManagerFactory 和 Spring JPA
  • 如何隐藏共享操作提供程序附近的共享操作(使用最多的)图标?

    看图片 如何隐藏 P 图标 表示分享到 Pinterest 它们都在操作栏上 我使用 ActionBarSherlock 如果您愿意保留所有分享历史数据模型 但只是不想要额外的 默认共享活动 icom 答案在使用 ShareActionPr
  • 将 java.sql.Timestamp 转换为 Java 8 ZonedDateTime?

    将 Joda 时间迁移到 Java 8 Joda UserObject user new UserObject user setCreatedAt new DateTime rs getTimestamp columnName 迁移到 Ja
  • 如何确定 C++03 中的类型是否可取消引用?

    In C 03 如何判断一个类型是否T是可解引用的吗 我的意思是 我如何静态地确定是否 t将是一个有效的表达式t类型的T 我的尝试 template
  • GitHub 与现有 GPG 密钥合并失败

    我们有多个 github 存储库 需要对拉取请求进行签名提交 有时 由于警告 提交需要签名 我们无法合并拉取请求 即使提交已签名 看起来创建拉取请求的人可以合并它 Sqash 和合并 即使它只包含 1 次提交 这发生在两个帐户都是拉取请求的
  • 迭代器的性能优势?

    使用迭代器可以提供哪些性能优势 如果有 这似乎是解决许多问题的 正确方法 但它是否会创建更快 更内存敏感的代码 我正在专门用 Python 思考 但不要将答案限制于此 实际上 Python 邮件列表上有一篇关于此的非常好的邮件 迭代器与列表
  • Angular 2:从另一个组件调用现有组件

    我正在使用路由功能使用 Angular 2 创建一个应用程序 并且我有一个由较高路由之一呈现的弹出组件 并且我想在由以下之一呈现的组件中的单击事件上打开它更深层次的路线 例如 假设我有一个基本路由器 其模板包含弹出窗口 Component
  • 使用 C++0x decltype 返回值时返回局部变量或临时变量的地址

    Edit 这确实是编译器的一个bug 我开了一个defect https connect microsoft com VisualStudio feedback details 573330 bad code generated for f