相信对 C++ 语言熟悉的同学应该都知道,C++ 在它的第 11 个版本中,加入了新的名为“移动构造函数”的构造函数类型。通过使用移动构造函数,我们可以在对象进行“复制”时,直接“窃取”拷贝对象所保有的一些资源。但在大多数情况下,当我们在代码中声明类的移动构造函数时,都通常会使用 “noexcept” 关键字来修饰对应的移动构造函数,那这样做是为什么?或者说这样做有哪些好处呢?
于航,PayPal 高级软件工程师,FCC (FreeCodeCamp China) 上海技术社区负责人, QCon、GMTC 大会讲师,WebAssembly 技术布道者。2017 年注册成为 W3C 官方 CG(Community Group)成员,2018 年出版了《深入浅出 WebAssembly》,是国内第一本 Wasm 技术书,为推动国内 Wasm 技术发展和落地实践做出了一定贡献。
编辑回复: 你可以看看吴老师那个C++专栏。
作者回复: hh谢谢 会考虑的
作者回复: 其实这几个一起看就行,我这里说的只是从我的角度来看,毕竟C++语言细节复杂使用方式也各种各样,所以仅供参考。其实这三个convention主要就是为了减少不必要的对象拷贝过程,用移动或者in-place生成来代替拷贝构造进而提高性能,但现代编译器都会有各种优化手段比如RVO和NRVO,不一定这么做就会提高性能,但如果团队协作的话可以作为一种规范,毕竟没有坏处。BTW,这里的“禁止”要看具体的类和场合,也不能一概而论。
作者回复: 在满足一定条件(没有用户定义的拷贝构造函数、拷贝赋值、移动赋值以及析构函数)的时候会自动生成 implicitly-declared 的移动构造函数。当然细节比较多可以看下cppreference上的语言规范。