的顺序 成员初始化列表 无关紧要,成员将按其声明的顺序进行初始化。
所以,首先 m_Foo(std::move(ctorArg)) 将零 ctorArg 的 然后 强> m_Field(ctorArg->field) 将试图消除空洞 ctorArg 。
m_Foo(std::move(ctorArg))
ctorArg
m_Field(ctorArg->field)
将您的代码更改为:
class SomeClass { private: std::unique_ptr<foo> m_Foo; int m_Field; public: SomeClass(std::unique_ptr<int> ctorArg) : m_Foo(std::move(ctorArg)), m_Field(m_Foo->field) { } };
也就是说,始终按照声明字段的顺序提及初始化程序,并且不使用已从中移出的输入参数。