C++ 说xvalue具有同一性并且是可移动的是正确的吗?
根据这份文件:C++ 说xvalue具有同一性并且是可移动的是正确的吗?,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,根据这份文件: l值具有同一性且不可移动 pr值是可移动的,但没有标识 x值具有标识性且可移动 关于这些,我有几个问题 a。x值具有标识的示例是什么?以下内容不合法: Foo f; &std::move(f); b。我可以重载Foo类的&-运算符并使其返回this,以便以下内容合法: &Foo(5); 但是像Foo(5)这样的pr值不能有标识。还是对身份有更微妙的解释 还是对身份有更微妙的解释 链接的文档包含以下两个定义: “has identity”-即和地址,一个指针
Foo f;
&std::move(f);
b。我可以重载Foo类的&-运算符并使其返回this,以便以下内容合法:
&Foo(5);
但是像Foo(5)这样的pr值不能有标识。还是对身份有更微妙的解释
还是对身份有更微妙的解释
链接的文档包含以下两个定义:
- “has identity”-即和地址,一个指针,用户可以确定是否有两个副本 一模一样的
- “可从”移动–即,我们被允许以某种不确定的方式保留“副本”的来源, 但有效状态
x值具有标识的示例是什么 标准本身给出了生成xvalues的表达式列表(见§5/7): 表达式是一个xvalue,如果它是:
- 隐式或显式调用返回类型为右值引用的函数的结果 对于对象类型
- 对对象类型的右值引用的强制转换
- 类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是xvalue,或
- 指向成员表达式的.*指针,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针
struct A { int m; };
A&& operator+(A, A);
A a;
A b;
a + b; // xvalue
A&& f();
f(); // xvalue
f().m; // xvalue
A a;
static_cast<A&&>(a); // xvalue
std::move(a); // xvalue
结构A{int m;};
A&&运算符+(A,A);
A A;
A b;
a+b;//xvalue
A&&f();
f();//xvalue
f().m;//xvalue
A A;
静态(a);//xvalue
标准::移动(a);//xvalue
< Stroutrup > C++编程语言的这条线可以清楚地解释这个问题: 。。。std::move(vs)是一个xvalue:它显然具有标识(我们可以将其称为vs),但我们已通过调用std::move()(§3.3.2,§35.5.1)明确授予将其从中移动的权限
xvalue通常是强制转换到右值引用或访问xvalue类对象成员的结果。例如,
autox=42;静态强制转换(x)
此静态强制转换
的结果是一个x值。您是否阅读了标准中值类别的正式规范?我对这个“具有同一性”原则也有点困惑(有些人也将其用作“对象”的定义),但标准似乎没有使用它。x值表达式的同一性是什么?你是怎么得到的?表达式std::move(a)的标识(或地址)是什么?我想是&a。但是我们不能对它应用&-运算符。这与公关价值有何不同?或者是因为名称绑定到基础对象,但x值表达式使其可以从中移动。@ArindamMukherjee:这是一个有趣的问题。我不确定不允许xvalue地址的原因,但我怀疑这只是为了避免错误。xvalues在实践中相当罕见,因此没有太多理由让获取它们的地址变得非常方便。xvalue将转换为常量左值引用,然后您可以获得被引用对象的地址。@ArindamMukherjee:但它仍然会提出一个问题,即“标识”是什么,因为您也可以将常量引用绑定到prvalue。这似乎取决于是否涉及到临时合同。那么,一旦一个引用绑定到一个临时的,并且可以获取它的地址,它是否就变成了非临时的呢?我想这是一种看法。