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 来说是两种不同的含义吗? 的相关文章

  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 为什么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 中 对值类别有 具有同一性 可以从其中移动 的解释 并且 同一性 含义的定义仍然存在于参