我正在寻找一种标准方法来告诉 C++ API 的用户构造函数(或方法)是否接受分配在堆栈上的对象作为有效参数。是否有一种模式(例如,特殊的构造函数/方法签名)告诉这里没有堆栈对象/这里没有堆栈对象?如果在没有另外记录的情况下允许堆栈对象,是否存在默认假设的常识?
问题说明:当类 Vector6D
具有构造函数 Vector6D(const Vector3D& upper, const Vector3D& lower)
时,至少有两种方法可以实现该类:
a) 在构造函数中复制两个 vector 的元素并忘记 Vector3D
实例。
b) 聚合 Vector6D
中的 Vector3D
实例,并继续使用后续方法调用的引用。
对于 a) Vector3D
实例分配在哪里并不重要。对于 b),如果 Vector3D
实例分配在堆栈上,则当堆栈帧消失时,实现将停止工作。
因此,如果不查看实现或文档,用户就无法决定要做什么。
编辑:上下文是一个嵌入式软件项目,不允许我使用 STL、异常、提升等。
最佳答案
C++ 中没有机制强制构造函数(或其他可变成员方法)参数的生命周期超过对象的生命周期。
只有堆分配对象的所有权,通过std::unique_ptr<T>
保存和传递, std::shared_ptr<T>
,或类似的,可以干净地表达和转移。
具有临时约定、编译器未强制执行、暗示参数存储为引用的类设计将被视为糟糕的类。
您应该考虑以下一般准则:
- 廉价复制的类型应该被复制。
- 不可复制的类型应该通过智能指针进行堆分配和传递/拥有。
- 如果类型需要与具有独立生命周期的其他对象持久共享,则被认为“太昂贵”而无法复制的类型也应该分配智能指针。
当生命周期不是由 API 用户任意控制时,此堆分配策略有异常(exception),但在您上面描述的情况下则不然。
关于c++ - 如果允许堆栈分配的引用作为参数,如何进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651245/