假设我有以下内容:
#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
' 的构造函数的第二个参数首先使用 move 构造函数构造,那么a
现在包含 anullptr
并且表达式a->x
将触发未定义的行为(可能是 segfault)。如果首先构造第一个参数,那么一切都会按预期工作。
如果这是一个普通的函数调用,我们可以创建一个临时的:
auto x = a->x
B b{x, std::move(a)};
但是在类初始化列表中我们没有创建临时变量的自由。
假设我不能改变B
,有没有可能的方法来完成上述?即unique_ptr
在同一个函数调用表达式中取消引用和移动 a 而不创建临时?
如果您可以更改B
的构造函数但不能添加新的方法,例如setX(int)
怎么办?那会有帮助吗?
谢谢