我以为我已经设法完全理解(在其他SO问题的帮助下,谢谢)关于值类别的C ++ 17的更改,但是现在我注意到了这个问题,这表明我不太了解它们。
在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
Run Code Online (Sandbox Code Playgroud)
在第二和第三种情况下,我获得一个xvalue,这意味着它应该具有一个标识。因此,我应该能够得到它的地址 [编辑:]我应该能够确定它是否与某些其他表达式引用相同的实体,但是我认为我不能。当然,在第三种情况下,我可以将“&r”作为单独的命令执行,然后将其地址与另一个表达式的地址进行比较,但这是因为A &&是左值。是通过A &&取得地址,在这种情况下,“直接或间接获得”是什么意思?我认为这不是正确的答案,因为在C ++ 11中,我也可以轻松地做到
A&& r = …Run Code Online (Sandbox Code Playgroud)