Рассмотрим следующий фрагмент кода:
#include <iostream>
#include <string>
class A {
public:
A() {
std::cout << "A::A()\n";
}
~A() {
std::cout << "A::~A()\n";
}
A(const A&) = delete;
A(A&&) {
std::cout << "A::A(A&&)\n";
};
};
A f() {
A a;
return a;
}
int main() {
A a = f();
return 0;
}
Он отлично компилируется с g++
и clang++
и выводит
A::A()
A::~A()
Похоже, что в этом случае срабатывает RVO. Обратите внимание, что конструктор перемещения не вызывается.
Однако, если удалить этот неиспользуемый конструктор перемещения из приведенного выше кода, фрагмент кода превратится в это:
#include <iostream>
#include <string>
class A {
public:
A() {
std::cout << "A::A()\n";
}
~A() {
std::cout << "A::~A()\n";
}
A(const A&) = delete;
};
A f() {
A a;
return a;
}
int main() {
A a = f();
return 0;
}
И clang++
, и g++
отказываются компилировать это, потому что конструктор-копия класса A
помечен как удаленный, поэтому кажется, что RVO не происходит.
Как к этому может привести удаление неиспользуемого конструктора перемещения?
Apple LLVM version 7.3.0 (clang-703.0.31)
. Также ideone.com/xTpD56 - person miguel.martin   schedule 01.06.2016