【发布时间】:2010-06-12 12:19:57
【问题描述】:
在 C++11 中,可以根据表示调用方法的对象的表达式是左值还是右值来重载方法。如果我从通过右值调用的方法返回*this,我是否需要从*this 显式地move?
Foo Foo::method() &&
{
return std::move(*this); // Is this move required or not?
}
不幸的是,我不能简单地在我的编译器上测试这个,因为 g++ 还不支持这个功能:(
【问题讨论】:
-
我希望
move是必需的,因为this是一个命名的右值,类似于函数采用右值参数的情况。但不让它成为答案,因为我不能引用它的章节和诗句:) -
@jalf:我希望移动是必需的,因为通常
*E是一个左值,但谁知道:) 我以前从未听说过命名的右值。你确定吗”? (没有双关语!) -
命名右值是一个新术语,用于消除涉及引用的重载调用的歧义。例如如果我们有
foo(X& x)和foo(X&& x),那么foo(someX)调用什么,即someX和X&或X&&?答案是X&,因为someX有一个名字——它是一个命名的右值,它是一个X&。如果我们调用foo(someX + something),那么它将是X&&,因为表达式没有“名称”。 -
"是
someX和X&还是X&&?" -> 呃,不是吗?它是一个 X :) 我看不出someX除了左值之外什么都不是......
标签: c++ c++11 rvalue-reference