为什么占用临时地址是非法的?

2024-03-18

我知道下面写的代码是非法的

void doSomething(std::string *s){}
int main()
{
     doSomething(&std::string("Hello World"));
     return 0;
}

原因是我们不允许获取临时对象的地址。但我的问题是WHY?

让我们考虑下面的代码

class empty{};
int main()
{
      empty x = empty(); //most compilers would elide the temporary
      return 0;
}

接受的答案here https://stackoverflow.com/questions/4286301/why-isnt-the-copy-constructor-called-here/4286330#4286330提及

“通常编译器将临时对象和副本视为位于内存完全相同位置的两个对象,并避免复制。”

根据该声明,可以得出结论,临时文件存在于某个内存位置(因此可以获取其地址),并且编译器决定通过在临时文件所在的同一位置创建就地对象来消除临时文件。

这是否与不能获取临时地址的事实相矛盾?

我也想知道返回值优化是如何实现的。有人可以提供与 RVO 实施相关的链接或文章吗?


&std::string("Hello World")

问题不在于这个std::string("Hello World")产生一个临时对象。问题在于表达式std::string("Hello World")是引用临时对象的右值表达式。

您无法获取右值的地址,因为并非所有右值都有地址(并且并非所有右值都是对象)。考虑以下:

42

这是一个整数文字,它是一个主表达式和一个右值。它不是一个对象,并且(可能)没有地址。&42毫无意义。

是的,右值可以引用一个对象,就像第一个示例中的情况一样。问题是并非所有右值都引用对象。

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

为什么占用临时地址是非法的? 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • URL 路由 C# mvc 和 Web 表单

    所以我有一个 webforms 和一个 mvc 应用程序组合在一起 并试图让事情正确路由 我的默认路由按预期工作 但是当我单击其中一个视图中的操作链接时 它没有路由到正确的页面 这是我的路由代码 void RegisterRoutes Ro
  • Tomcat Digest 与 Manager WebApp

    我正在尝试为 tomcat 管理器应用程序设置摘要密码 我有
  • 隐藏变量在 R 中如何表现?

    是否有任何重要的 1 原因不导出名称为 fnname在 R 包中 我知道点前缀变量的主要用途是在使用以下函数搜索环境时将变量表示为隐藏ls 并表示对象或列表中的字段应被视为私有字段 如 S4 Data 字段 test env lt new
  • 读取 read_csv2(readr 包)中的行名称

    我正在尝试从这里加载示例数据集 http www agrocampus ouest fr math RforStat decathlon csv http www agrocampus ouest fr math RforStat deca
  • JavaScript 中的 split()

    我有代码 function filter var url window location alert url alert url split 1 当我启动它时 我只收到一条警报消息 http localhost 8000 index 3 1
  • 找不到 Spring MVC Neo4jConfiguration 类

    我正在学习 Spring MVC 我想扩展 Neo4jConfiguration 类 但它不可用 我导入了以下依赖项
  • 我无法登录 Tomcat Manager 应用程序

    我在 stackoverflow 上阅读了很多主题来解决我的问题 但没有一个有用 当我尝试使用很多不同的配置登录管理器应用程序 http localhost 8080 manager html 1 时 但我总是获得401 未经授权尝试使用权
  • SQL 约束/触发器 - 是否可以编写一个约束来检查“插入记录时它必须包含两个字段之一”?

    是否可以对输入的记录设置约束 触发器 以检查用户是否至少输入了三个字段之一 所有字段都可以为空 例如 我有一个数据库用于跟踪其他软件中的错误和新功能 当发现错误时 会创建一个功能记录 该记录可以具有三个外键 discoveredID fix
  • 如何匹配字符串中的第一个单词?

    我想匹配这个词 St or St or st or st 但只能作为字符串的第一个单词 例如 St Mary Church Church St 应该首先找到 St st Mary Church Church St 应该只找到 st st M
  • 为什么这个隐式函数没有被应用?

    尝试 Alexey Romanov 中提出的 TupleN 的隐式转换如何在元组之间应用隐式转换 https stackoverflow com questions 23911151 how to apply implicit conver
  • 跨不同项目设置发布/订阅订阅?

    在我的 GCP 项目 项目A 我创建了一个 Pub sub 主题 topicA 并且在此发布 订阅主题中发布的消息需要在其他 GCP 项目 项目B 通过订阅 订阅B 推荐的设置方式是什么订阅B Define 订阅B在项目 A 中 并使用适当
  • 双显示器中的 Delphi XE Form 和 Source

    有人知道我是否可以将 IDE 设置为在一个显示器和另一个显示器上显示源代码 我谈论相同的 pas 因为我可以在每个监视器中查看 2 个不同的 pas 不确定 XE 但在 2007 年你可以去Tools gt Options打开选项对话框 然
  • Windows 窗体旋转

    当您在 Net 中创建表单时 它会显示为纵向布局的对话框 通常没有人喜欢横向或颠倒地阅读 但我有一个非常充分的理由旋转表格 有人知道如何在 Windows Vista 上用 C 实现这一点吗 必须在 WinForms 中吗 在 WPF 中
  • Backbone.js 在填充集合后调用渲染

    我试图在获取集合后调用渲染 在我的初始化方法中 我有 this collection bind all this render this this collection fetch 在 IE 中 有时它似乎会在集合有数据之前尝试渲染 集合似
  • 如何将活动 Excel 工作簿附加到电子邮件

    我整个上午都在尝试获取此 VBA 脚本 将我的活动 Excel 文档附加到自动生成的 Outlook 消息中 如果我将文件路径声明为字符串并附加它 一切都会正常工作 除了我想附加当前 Excel 文档的完整文件路径而不是使用静态字符串值 这
  • 优化 boost::spirit::qi 解析器

    我有一个解析器 它基本上打印出堆栈机的操作 并根据给定的运算符优先级给出一些表达式 我的目标是尽可能优化速度 我读过了一篇关于 qi 优化的文章 https code google com p scribblings by apoch wi
  • Bash - 变量变量[重复]

    这个问题在这里已经有答案了 我有变量 foo something 并想使用 bar foo echo bar 得到 某事 的回应 在 bash 中 您可以使用 variable 使用可变变量 foo something bar foo ec
  • 查找具有 minidom 属性的元素

    Given
  • Python列表理解删除重复项

    我想要独特的元素hubcode list 我可以这样做 hubcode alarm obj HubAlarm objects all for obj in hubcode alarm obj hubcode obj hubcode if h
  • 为什么占用临时地址是非法的?

    我知道下面写的代码是非法的 void doSomething std string s int main doSomething std string Hello World return 0 原因是我们不允许获取临时对象的地址 但我的问题