有没有办法从采用右值引用的构造函数调用移动构造函数? [重复]

问题描述 投票:0回答:1

假设我有一个带有移动构造函数的类

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 &&)

c++ reference move-semantics rvalue
1个回答
1
投票

您可以将初始化列表更改为a(std::move(pa))

,如下所示。

这是因为括号内的表达式

a

具有左值表达式的
值类别

class B { A a; public: //------------vvvvvvvvv----------->explicitly use std::move B(A &&pa) : a(std::move(pa)) {} };
    
© www.soinside.com 2019 - 2024. All rights reserved.