![](/img/trans.png)
[英]c++11: given f(const X&) and f(X&&), do we ever need f(X&)?
[英]c++: why does foo(X&) get called instead of foo(X&&)?
在這里,creator()返回指向X的指針,我將其取消引用並傳遞給foo。 由於這是一個右值,因此應使用move語義,對嗎? 但是當我運行它時,我發現調用了foo(X&)。
#include <iostream>
using namespace std;
struct X {
int i;
};
void foo(X& x) {
cout << "foo(X&)" << endl;
}
void foo(X&& x) {
cout << "foo(X&&)" << endl;
}
struct X* creator() {
return new X {5};
}
main() {
X x{5};
foo(*creator()); // prints foo(X&)
}
creator()
返回一個指針。
取消引用該指針會使您成為左值。 指針取消引用會產生一個左值。 畢竟,如果p
是一個指針,則可以為其分配: *p=some_value
,並且只能分配給一個左值,因此它必須是一個左值。
您對兩件事感到困惑。 函數確實返回一個右值。 但是您沒有傳遞函數返回的內容。 該函數返回一個指針,並且您正在取消引用該指針,這將導致一個左值。
用身份和可移動性來思考事物會很有幫助:
取消引用指針會產生一個具有標識的表達式,該標識不能被移動,因此它是一個左值。 因此,它與X&
重載匹配。
如果要調用另一個重載,則必須注釋該表達式以指示可以安全地將其移出。 這就是std::move
的作用。 完成此操作后,表達式將變為一個xvalue,並且現在與X&&
重載匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.