Я создаю класс A, оператор перезаписи + и конструктор A(A&&)
, мне интересно, если я вызову
A a, b;
A c = a + b;
Мой конструктор A(A &&)
называется?
Я попробовал некоторый код, но получаю очень запутанные результаты
//try2.cpp
#include <iostream>
#include <string>
using namespace std;
class A {
public:
string s;
A(A &&a) { s=std::move(a.s); cout<<"A(A &&a) called"<<endl;}
A() {}
};
A operator+(const A &a, const A &b) {
A c;
c.s=a.s+b.s;
return c;
}
int main() {
A a,b;
a.s = "123";
b.s = "456";
A c = a+b;
cout<<c.s<<endl;
return 0;
}
Я использовал gcc 7.0: g++ -std=c++1y try2.cpp
Вывод 123456
, поэтому A(A &&a)
не называется
Но тогда я меняю
A(A &&a) = delete;
Затем компилятор выдает ошибку:
try2.cpp: In function ‘A operator+(const A&, const A&)’:
try2.cpp:14:10: error: use of deleted function ‘A::A(A&&)’
return c;
^
try2.cpp:7:3: note: declared here
A(A &&a) = delete;
^
try2.cpp: In function ‘int main()’:
try2.cpp:21:11: error: use of deleted function ‘A::A(A&&)’
A c = a+b;
^
try2.cpp:7:3: note: declared here
A(A &&a) = delete;
Требуется конструктор A(A &&a)
. Но почему предыдущий код не вызывал его?