请考虑以下代码片段:
#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;
}
由于类A的复制构造函数被标记为删除,因此clang++
和g++
都拒绝编译此代码,所以似乎没有RVO优化发生。
删除未使用的移动构造函数怎么会导致这种情况呢?
Apple LLVM version 7.3.0 (clang-703.0.31)
。此外,http://ideone.com/xTpD56。 - miguel.martin