右值引用
带名字的右值引用使用的时候会变成左值引用
result type must be constructible from input type
#include <iostream>
#include <vector>
#include <memory>
struct X {
X(int i) : i_(i){}
X() = delete;
X(const X&) = delete;
X(X&&) = default;
int i_;
};
struct A {
A(std::vector<std::unique_ptr<X>>&& x) : x_(x) {}
std::vector<std::unique_ptr<X>> x_;
};
int main() {
return 0;
}
编译错误:result type must be constructible from input type
这是因为A(std::vector<std::unique_ptr<X>>&& x) : x_(x) {}
里面,x_(x)
中的x
是有名字的,所以它被使用的时候类型会变成左值引用。所以解决方案就是用std::move(x)
强行将其又变成右值引用:
#include <iostream>
#include <vector>
#include <memory>
struct X {
X(int i) : i_(i){}
X() = delete;
X(const X&) = delete;
X(X&&) = default;
int i_;
};
struct A {
- A(std::vector<std::unique_ptr<X>>&& x) : x_(x) {}
+ A(std::vector<std::unique_ptr<X>>&& x) : x_(std::move(x)) {}
std::vector<std::unique_ptr<X>> x_;
};
int main() {
return 0;
}
cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’
#include <iostream>
void ss(int&& a){
std::cout << a << std::endl;
}
int main(){
int a = 1;
int&& b = std::move(a);
ss(b);
return 0;
}
int&& b
是带名字的,所以在ss(b)
里,使用b的时候会变成左值引用。解决方案就是再加一个std::move(b)
:
#include <iostream>
void ss(int&& a){
std::cout << a << std::endl;
}
int main(){
int a = 1;
int&& b = std::move(a);
- ss(b);
+ ss(std::move(b));
return 0;
}