为什么不调用移动构造函数?
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));
}
我有如下一段代码:
#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));
}