假设我有一个带有移动构造函数的类
A
:
class A {
public:
A(A &&other) = default;
}
假设我和一个
A
成员一起上课:
class B {
A a;
}
问题的第一部分:如何编写一个构造函数,它接受对
A
的右值引用并调用 A(A &&)
?
如果我写这个:
class B {
A a;
public:
B(A &&a) : a(a) {}
}
我收到以下错误:
move_constructor_call.cc:9:16: error: call to implicitly-deleted copy constructor of 'A'
B(A &&a) : a(a) {}
^ ~
move_constructor_call.cc:3:5: note: copy constructor is implicitly deleted because 'A' has a user-declared move constructor
A(A &&other) = default;
^
我认为这是因为
a
被视为左值,因此不会调用移动构造函数。但我不确定为什么它没有被调用,尽管 a
应该具有类型 A &&
。移动构造函数是否要求构造的值是右值,因为它不在这里?我一直以为右值引用的左值就足够了。
这是问题的第二部分:为什么这里不调用
A(A &&)
?
您可以将初始化列表更改为a(std::move(pa))
,如下所示。这是因为括号内的表达式
a
具有左值表达式的值类别。
class B {
A a;
public:
//------------vvvvvvvvv----------->explicitly use std::move
B(A &&pa) : a(std::move(pa)) {}
};