在这里,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,并且只能分配给一个左值,因此它必须是一个左值。

您对两件事感到困惑。函数确实返回一个右值。但是您没有传递函数返回的内容。该函数返回一个指针,并且您正在取消引用该指针,这将导致一个左值。

关于c++ - C++:为什么调用foo(X&)而不是foo(X &&)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39261477/

10-10 21:26
查看更多