【发布时间】:2016-07-04 06:50:40
【问题描述】:
如果我有这门课:
class Foo {
public:
Foo() = default;
// version 1 move constructor
Foo(Foo &&f) : v_() {
v_.swap(f.v_);
}
// version 2 move constructor
Foo(Foo &&f) : v_(), m_() {
v_.swap(f.v_);
}
private:
std::vector<int> v_;
std::mutex m_;
};
void bar(Foo &&f) {
// construct a new object from f
Foo f2(std::move(f)); // f2's value before calling constructor is undefined
}
这两个移动构造函数之间有什么区别吗?互斥锁 m_ 是否在版本 1 中自动初始化,还是我需要像在版本 2 中一样显式列出它?
请注意,我没有交换互斥体,没有必要这样做(我明确地将移动构造函数标记为 非线程安全,因为它不可能是由于其他原因) .
【问题讨论】:
-
不,没有区别。
-
移动构造函数WRT初始化成员没有什么特别的。
-
只要成员有默认构造函数,您就不需要显式初始化它,例如 POD 不需要,
std::mutex可以。 -
@XerenNarcy 区别不是POD/非POD类型,而是类/非类类型。 POD 结构仍将调用其(概念上的)默认构造函数。当然,然后什么都不做。
标签: c++ c++11 move-constructor