cppreference是否使用术语“ [对象的身份]”对c ++ 11和c ++ 17有两种不同的含义?

Krzysztofk

我以为我已经设法完全理解了C ++ 17在值类别方面的变化(在其他SO问题的帮助下,谢谢),但是现在我注意到了这个问题,这表明我不太了解它们。

在C ++ 11中,对值类别有“具有身份/可以从中移出”的解释,并且cppreference中仍然存在“身份”的含义的定义

具有身份:可以通过比较对象的地址或它们标识的功能(直接或间接获得)来确定该表达式是否与另一个表达式引用相同的实体。

在C ++ 17中,“具有身份/可以从中移出”不再成立,但是新定义也基于“身份”的概念:

glvalue(“广义” lvalue)是一个表达式,其求值确定对象,位字段或函数的身份;

我的问题/误解是:这是“身份”的同一意思,还是不同的“身份”?据我了解,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中,临时对象是prvalues。因此,我假设我可以将A &&绑定到该事实(与任何左值一样,我可以接受一个地址,但只能在一个单独的表达式中)不足以得出其评估确定身份的结论(毕竟,无论发生什么情况, “&r;”行不是我的原始表达式求值的一部分),但是在c ++ 17中,它看起来像是唯一可能的解释?

您能通过确定我写的哪一部分不正确来帮助我吗?还是正确的,答案仅仅是“身份”一词改变了其含义?

戴维斯鲱鱼

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

真正的意思是该目标对象的地址被无形地传递到prvalue构造的位置,以便从头开始将其显示在正确的位置。编译器已经以RVO的名称进行了此操作,但是更改保证了这一点,并删除了正式的可移动性限制。

xvalue肯定具有一个标识:如果通过(两种)引用将prvalue传递给函数,则它可以使用其地址。它甚至可以返回它,以便(在相同的全表达式期间)创建它的函数可以使用其地址。禁止采用临时住址是一项单独的安全措施,即使在(例如)static_cast<A&&>(get_a())用于强迫临时实现后也适用(但是,它不能阻止您获取glvalue的地址,该glvalue引用了另一个函数返回的临时值。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 C# 中,如何使用具有两种不同类型的泛型?

来自分类Dev

C ++类中的两种不同的变量初始化。有什么不同?

来自分类Dev

这两种样式的C函数指针定义是否不同?

来自分类Dev

是否有可能执行两种不同的“+ =”和 - 在一个代码行操作“=”?

来自分类Dev

C#中具有两种不同数据类型的二维数组

来自分类Dev

为什么在C中有两种初始化指针的不同方法

来自分类Dev

具有相同数据的两种不同格式的文件是否可以具有相同的校验和值?

来自分类Dev

C ++中的两种不同的混合模式。(mixin?CRTP?)

来自分类Dev

使用Azure API管理服务,是否可以采用两种不同的身份验证方法?

来自分类Dev

这两种有关链表的方法有何不同?C ++中的1个论点与2个论点

来自分类Dev

JSON.NET:定义可以容纳两种不同类型对象的C#字段

来自分类Dev

C中有两种不同的指针语法,哪一种是正确的,两者之间有什么区别?

来自分类Dev

C#和MySQL Command-两种不同的样式?

来自分类Dev

C#和MySQL Command-两种不同的样式?

来自分类Dev

在C#中,如何将具有不同数量和参数类型的两种方法转换为一种?

来自分类Dev

Bitbucket的“远程存储库”是否可以表示两种不同的含义?

来自分类Dev

Android是否有两种不同的睡眠模式

来自分类Dev

在C#中将值从两种不同的形式传递到一种主要形式

来自分类Dev

在C ++ 11中同时使用virtual和override关键字是否有任何细微之处?

来自分类Dev

使用C中的单个消息队列是否可以进行两种方式的通讯

来自分类Dev

如何对两种不同类型列表的对象进行分组和排序?

来自分类Dev

在C ++函数中返回两种不同类型的两个值

来自分类Dev

GSON在Android中使用两种不同类型的对象反序列化列表

来自分类Dev

C ++ 11和C ++ 14中的`bsearch`规范是否有缺陷?

来自分类Dev

为什么要使用两种不同的方法slice()和substring()?

来自分类Dev

使用两种不同来源的键和值进行字典推导

来自分类Dev

在C#的方法链中选择两种不同的方法之一

来自分类Dev

为什么这两种访问C ++映射对部分的方式不同

来自分类Dev

C#.net : 意外双击按钮显示两种不同的形式

Related 相关文章

  1. 1

    在 C# 中,如何使用具有两种不同类型的泛型?

  2. 2

    C ++类中的两种不同的变量初始化。有什么不同?

  3. 3

    这两种样式的C函数指针定义是否不同?

  4. 4

    是否有可能执行两种不同的“+ =”和 - 在一个代码行操作“=”?

  5. 5

    C#中具有两种不同数据类型的二维数组

  6. 6

    为什么在C中有两种初始化指针的不同方法

  7. 7

    具有相同数据的两种不同格式的文件是否可以具有相同的校验和值?

  8. 8

    C ++中的两种不同的混合模式。(mixin?CRTP?)

  9. 9

    使用Azure API管理服务,是否可以采用两种不同的身份验证方法?

  10. 10

    这两种有关链表的方法有何不同?C ++中的1个论点与2个论点

  11. 11

    JSON.NET:定义可以容纳两种不同类型对象的C#字段

  12. 12

    C中有两种不同的指针语法,哪一种是正确的,两者之间有什么区别?

  13. 13

    C#和MySQL Command-两种不同的样式?

  14. 14

    C#和MySQL Command-两种不同的样式?

  15. 15

    在C#中,如何将具有不同数量和参数类型的两种方法转换为一种?

  16. 16

    Bitbucket的“远程存储库”是否可以表示两种不同的含义?

  17. 17

    Android是否有两种不同的睡眠模式

  18. 18

    在C#中将值从两种不同的形式传递到一种主要形式

  19. 19

    在C ++ 11中同时使用virtual和override关键字是否有任何细微之处?

  20. 20

    使用C中的单个消息队列是否可以进行两种方式的通讯

  21. 21

    如何对两种不同类型列表的对象进行分组和排序?

  22. 22

    在C ++函数中返回两种不同类型的两个值

  23. 23

    GSON在Android中使用两种不同类型的对象反序列化列表

  24. 24

    C ++ 11和C ++ 14中的`bsearch`规范是否有缺陷?

  25. 25

    为什么要使用两种不同的方法slice()和substring()?

  26. 26

    使用两种不同来源的键和值进行字典推导

  27. 27

    在C#的方法链中选择两种不同的方法之一

  28. 28

    为什么这两种访问C ++映射对部分的方式不同

  29. 29

    C#.net : 意外双击按钮显示两种不同的形式

热门标签

归档