根据这份文件:
http://www.stroustrup.com/terminology.pdf
我对这些问题有几个问题。
一个。具有身份的x值的例子是什么?以下是不合法的:
Foo f;
&std::move(f);
湾我可以重载Foo类的& -operator并使其返回 this ,以便以下内容合法:
&Foo(5);
但像Foo(5)这样的公关值不能具有同一性。还是对身份有一个更微妙的解释?
答案 0 :(得分:4)
或者对身份有更微妙的解释吗?
您链接的文档包含以下两个定义:
- “具有身份” - 即地址,指针,用户可以确定是否有两个副本 相同等。
- “可以从”移动“ - 即我们被允许在某些不确定的地方留下”副本“的来源, 但是有效状态
看一下标准,我们可以收集对象的定义(按照§1.8/ 1):
对象是存储区域。
根据§1.7/ 1:
每个字节都有一个唯一的地址。
有一个地址。这意味着定义非常广泛,几乎包含任何类型值的每个对象(rvalue,xvalue,prvalue,lvalue等)。
具有身份的x值的示例是什么?
标准本身给出了生成xvalues的表达式列表(在§5/ 7中):
表达式是xvalue,如果它是:
- 调用函数的结果,无论是隐式还是显式,其返回类型是右值引用 对象类型,
- 强制转换为对象类型的右值引用,
- 一个类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是xvalue,或
- a。*指向成员的表达式,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针。
通常,此规则的作用是将命名的右值引用视为左值,将对象的未命名右值引用视为xvalues;对函数的右值引用被视为左值,无论是namedornot。
作为后续行动,我们举了几个例子。这是对它们的扩展:
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
答案 1 :(得分:4)
Stroutrup的The C ++ Programming Language中的这一行可能会清除这个问题:
... std :: move(vs)是一个xvalue:它显然具有标识(我们可以将其称为vs),但是我们明确地允许通过调用std :: move来移动它() )(§3.3.2,§35.5.1)。