为什么不调用移动构造函数?

Why is move-constructor not called?

我有如下一段代码:

#include <iostream>

struct T {
    int a;

    T() = default;

    T(T& other) {
        std::cout << "copy &\n";
    }

    T(T&& other) {
        std::cout << "move &&\n";
    }
};

void foo(T&& x) {
    T y(x); // why is copy ctor called??????
}

int main() {
    T x;
    foo(std::move(x));

    return 0;
}

我不明白为什么复制构造函数优于移动构造函数,即使 foo() 接受右值引用。

x 本身就是一个左值,即使它的类型是右值引用。 Value category 和类型是两个独立的属性。

Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;

您需要使用 std::move 将其转换为右值,就像在 main() 中的 x 上使用 std::move 一样。

void foo(T&& x)
{
    T y(std::move(x));
}