簡體   English   中英

C ++:為什么調用foo(X&)而不是foo(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM