右值引用
阅读量:
searchstar
2022-10-04 22:19:01
Categories:
Tags:
带名字的右值引用使用的时候会变成左值引用
#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; }
|