将rvalue引用(Movable&& a
)传递给函数时,Movable b(a)
会以某种方式触发已删除的复制构造函数。
main.cpp:在函数' void func(Movable&&)': main.cpp:25:16:错误:使用已删除的函数' Movable :: Movable(const Movable&)'可动b(a);
但Movable b(std::move(a))
有效。从阅读
template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;
我不理解Movable&& a
和std::move(a)
之间的区别。以下是一个最小的工作示例。
#include<memory>
class Movable {
public:
Movable() = default;
Movable(const Movable&) = delete;
Movable& operator=(const Movable&) = delete;
Movable(Movable&& o) {}
};
void func(Movable&& a) {
Movable b(std::move(a)); // this works
// Movable b(a); // this doesn't compile
}
int main() {
Movable A;
func(std::move(A));
}