考虑以下代码片段:
#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++
它用and编译得很好,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。
删除未使用的移动构造函数如何导致这种情况?