在这里,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/