假设我有以下几点: #include <memory> struct A { int x; }; class B { B(int x, std::unique_ptr<A> a); }; class C : public B { C(std::unique_ptr<A> a) : B(a->x, std::move(a)) {} }; 如果我正确理解有关“函数参数的未指定顺序”的C ++规则,则此代码是不安全的。 如果B的构造函数的第二个参数是使用移动构造函数首先构造的,那么现在包含一个nullptr ,expression式a->x将触发未定义的行为(可能是段错误)。 如果第一个参数是先构造的,那么一切都将按预期工作。 如果这是一个正常的函数调用,我们可以创build一个临时的: auto x = a->x B b{x, std::move(a)}; 但在类初始化列表中,我们没有创build临时variables的自由。 假设我不能改变B ,是否有任何可能的方法来完成上述? 即解除引用和移动一个unique_ptr在同一个函数调用expression式而不创build临时? 如果你可以改变B的构造函数,但不添加新的方法,如setX(int) ? 会有帮助吗? 谢谢