【发布时间】:2016-10-01 02:47:54
【问题描述】:
考虑以下代码sn-p:
#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 似乎发挥了作用。请注意,没有调用移动构造函数。
但是,如果从上面的代码中删除那个未使用的移动构造函数,那么 sn-p 就会变成这样:
#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 -
如果声明复制构造函数,则根本不会隐式声明移动构造函数。
标签: c++ c++11 move-semantics rvo