cppreference 使用术语“[对象的]标识”对于 c++11 和 c++17 来说是两种不同的含义吗?

2024-04-24

我以为我已经设法完全理解(在其他 SO 问题的帮助下,谢谢)C++17 关于值类别的更改,但现在我注意到这个问题,这表明我并不真正理解它们。

在 C++11 中,对值类别有“具有同一性/可以从其中移动”的解释,并且“同一性”含义的定义仍然存在于参考参数 https://en.cppreference.com/w/cpp/language/value_category:

具有同一性:可以确定表达式是否与另一个表达式引用相同的实体,例如通过比较对象的地址或它们标识的函数(直接或间接获得)。

在C++17中,“具有同一性/可以从其中移动”不再成立,但新的定义也是基于“同一性”的概念:

左值(“广义”左值)是一个表达式,其计算确定对象、位域或函数的身份;

我的问题/误解是:这是“身份”的相同含义,还是不同的“身份”?按照我的理解,c++17中的情况是这样的:

A f() { return A(); }

A a = f(); // 1: f() is a prvalue expression, used to directly initialize a.
f();       // 2: f() is a prvalue expr., converted to xvalue by temporary materialization
A&& r = f(); // 3: f() is a prvalue expr., converted to xvalue by temporary materialization

在第二种和第三种情况下,我获得了一个 xvalue,这意味着它应该有一个身份。所以我应该能够获取它的地址 [编辑:]我应该能够确定它是否与其他表达式引用相同的实体,但我认为我不能。当然,在第三种情况下,我可以将“&r”作为单独的命令执行,然后将其地址与其他表达式的地址进行比较,但这是因为 A&& 是左值。在这种情况下,通过 A&& 获取地址意味着“直接或间接获得”吗?我认为这不是正确的答案,因为在 C++11 中我也可以轻松地做到

A&& r = f(); // 4: f() is a prvalue expression. Temporary materialization does
             // not happen, the temporary (prvalue) gets its lifetime 
             // extended to match the lifetime of the reference
&r;

然而,r 引用的对象仍然是临时对象,尽管其生命周期已延长,并且在 c++11 中临时对象是纯右值。所以我假设我可以将 A&& 绑定到它(其中,像任何左值一样,我可以获取一个地址,但只能在一个单独的表达式中)这一事实不足以得出结论:它的评估决定了一个身份(毕竟,无论发生什么“&r;”行不是我原始表达式求值的一部分),但在 c++17 中,在我看来这将是唯一可能的解释?

您能帮我确定我写的哪一部分是错误的吗?或者这是正确的,答案只是“身份”这个词改变了它的含义?


为什么您认为 C++11 概念不再适用?该页面说该版本引入了“具有身份”的想法,而不是它是唯一使用它的版本。 C++17 的做法是,纯右值“等待”它们用于对象的初始化,从而完全成为对象。 (因此,它将“成为一个对象”与“具有身份”合并在一起,这更简单;显然,每个对象都可以拥有this被检测到。)

这真正的意思是,目标对象的地址被无形地传递到纯右值构造的位置,以便它从一开始就出现在正确的位置。编译器已经在 RVO 名称下这样做了,但这次更改保证了这一点并消除了正式的可移动性限制。

xvalue 当然有一个身份:如果您通过(任一类型)引用将纯右值传递给函数,它就可以获取其地址。它甚至可以返回它,以便(在同一个完整表达式期间)创建它的函数可以使用它的地址。禁止获取临时地址是一项单独的安全措施,即使在(例如)使用之后也适用static_cast<A&&>(get_a())强制暂时实体化。 (但是,它不能阻止您获取引用从另一个函数返回的临时值的泛左值的地址。)

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

cppreference 使用术语“[对象的]标识”对于 c++11 和 c++17 来说是两种不同的含义吗? 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何检查图像对象与资源中的图像对象是否相同?

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

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • 为什么Data.Hashmap中没有mapKeys?

    我想使用诸如mapKeys to map仅限按键 即有一个功能mapKeys in Data Map 但没有类似物Data Hashmap 此外 在Data Hashmap我没有发现任何有关操作按键的信息 是否只有不完整之处Data Has
  • 如何为我的 Android 应用程序添加代码混淆

    如何为 android apk 添加代码混淆 我用了proguard但仍然看到来自应用程序的代码decompiler 我像这样添加了progruad release debuggable true minifyEnabled true pr
  • MS Access 2003 - 连接表单上相同 ID 的字段类型

    好吧 工作中的一个人有一个小的访问数据库 他用它来跟踪事情 他使用的表单已经查询了他需要的内容并在表单上生成了结果 这确实是他所需要的 有一件事是 他对每条记录都有重复项 这些记录以不同的 类型 作为字段 标识符 我称之为 这是一个例子 I
  • Python Pandas Dataframe,删除任何列中值为“None”的所有行

    我有一个大数据框 创建时 None 用作无法计算数字的值 而不是 nan 如何删除任何列中包含 无 的所有行 我虽然我可以使用df dropna并设置值na 但我似乎做不到 Thanks 我认为这是数据框的一个很好的表示 temp pd D
  • 当输入类型为“文件”时,$dirty 无法按预期工作

    我对 AngularJS 很陌生 问题是我有一个包含两个字段的表单 名称和个人资料图片 如下面的代码所示 我正在使用 ng upload https github com twlson63 ngUpload https github com
  • iphone 的视图变灰了,怎么办?

    我想知道使视图部分变灰的方法是什么 类似于 UIAlertView 将除消息框之外的所有内容变灰的方式 现在我在目标区域顶部使用另一个自定义视图 但它看起来不太好 有任何想法吗 我使用您已经尝试过的方法得到了很好的结果 也许摆弄阿尔法是个好
  • 在 TypeScript 中,如何引用属于联合类型一部分的类型?

    我在 TypeScript 中为操作定义了一个联合类型 type Action type reset type add payload number type minus payload number 在某些函数中 我想引用联合类型的一部分
  • 无法理解调用签名

    如果这是一个有点愚蠢的问题 我深表歉意 我听说过一些有关 Typescript 中的调用签名的信息 但我不明白它们到底是做什么的 Typescript 文档说 在 JavaScript 中 函数除了可调用之外还可以具有属性 但是 函数类型表
  • Java 中将对象与 null 进行比较

    我正在尝试验证一个对象是否是null或不 使用以下语法 void renderSearch Customer c System out println search customer rendering gt try if c equals
  • Access 2010中的TableDef对象需要什么参考

    我正在尝试在新的 Access 2010 Access 安装中使用在 Access 2003 中编写的宏 mdb 文件 打开我的文件时出现编译错误TableDef无法找到对象 当我检查 工具 gt 参考 菜单时 我看到 Microsoft
  • Docker 远程上的 Pycharm 远程解释器:[Errno 2] 没有这样的文件或目录

    正如标题中所指定的 我尝试在 LAN 中的远程服务器上托管的 Docker 计算机中使用 Pycharm Professional 2018 2 和 python 远程解释器 我按照帮助创建了一个非常简单的示例 https www jetb
  • 用任意参数替换 sympy 函数

    这应该是一项简单的任务 但我很难让它在 Sympy 中工作 我想用特定公式替换带有任意参数的未定义函数 例如 from sympy import var a b c f Function f test f a b lin test subs
  • 无法加载文件或程序集

    当我尝试在 Visual Studio 2008 中进行调试时 出现以下错误 我已经清理了 ASP NET 临时文件夹并重新启动了 VS 我还删除了所谓的破坏性参考并将其添加回来 但似乎没有任何作用 有没有人遇到过类似的情况并且有解决方案吗
  • Mac 上的 Google Chrome 开发者工具键盘快捷键自定义

    我使用 Firefox Firebug 进行调试 但如果我可以自定义键盘快捷键 我会切换到 Google Chrome I need to activate and hide the developer tools gt inspect E
  • 在 OWIN 托管的 SignalR 实现中接受 ASP.NET 表单身份验证 cookie?

    我有一个使用 OWIN 的自托管 SignalR 实例 我想实施授权 我的用户已经使用表单身份验证登录到 ASP NET MVC 应用程序 由于两个应用程序可在同一 URL 上使用 因此 cookie 将在两者之间共享 如何在自托管 Sig
  • 将 AWS Lambda 设置为权限策略中的主体

    我有一个非常具体的 AWS Lambda 函数 我想将其作为 AWS Secret Manager 权限策略的主体 以便它可以检索机密 我想专门将此权限授予我的 Lambda 我创建了一个角色并将该角色分配给该策略 然而 我希望能够明确地写
  • 由于 ssl 错误,无法在 python 3.6 中 pip 安装软件包

    我正在远程服务器上工作 当我尝试在虚拟环境中使用 pip 安装任何内容时 出现错误 venv barta bivoj program pip install r requirements txt pip is configured with
  • java方法中的可选参数

    我想制作一个需要 1 个必需参数和 1 个可选参数的方法 但我发现如何制作一个可选数组 方法是在参数 int b 中制作 但这是一个数组 我想制作它只是这个值是 null 或用户输入它 我可以通过创建 2 个同名的方法来实现它 但一个具有单
  • Android:如何将十字图标放在 autocompletetextView 顶部

    我在将十字按钮放在文本视图顶部时遇到问题 我正在使用 LinearLayout 并且它没有出现 而在 Framelayout 上它可以工作 但这并不能解决我的目的 我附上我的 XML 供参考 请帮助我解决这个问题
  • cppreference 使用术语“[对象的]标识”对于 c++11 和 c++17 来说是两种不同的含义吗?

    我以为我已经设法完全理解 在其他 SO 问题的帮助下 谢谢 C 17 关于值类别的更改 但现在我注意到这个问题 这表明我并不真正理解它们 在 C 11 中 对值类别有 具有同一性 可以从其中移动 的解释 并且 同一性 含义的定义仍然存在于参