1

我正在寻找一种标准方法来告诉 C++ API 的用户构造函数(或方法)是否接受在堆栈上分配的对象作为有效参数。是否有一种模式(例如特殊的构造函数/方法签名)告诉这里没有堆栈对象/堆栈对象在这里没问题?如果在没有另外记录的情况下允许堆栈对象,则默认假设是否存在常识?

问题说明:当一个类Vector6D有构造函数Vector6D(const Vector3D& upper, const Vector3D& lower)时,至少有两种方法可以实现该类:

a) 在构造函数中复制两个向量的元素并忘记Vector3D实例。

b) 聚合中的Vector3D实例Vector6D并继续使用引用进行后续方法调用。

Vector3D对于 a)分配实例的位置无关紧要。对于 b) 如果Vector3D实例是在堆栈上分配的,则当堆栈帧消失时,实现将停止工作。

因此,如果不查看实现或文档,用户就无法决定要做什么。

编辑:上下文是一个嵌入式软件项目,我不允许使用 STL、异常、boost 等。

4

1 回答 1

1

C++ 中没有强制构造函数(或其他可变成员方法)参数生命周期超过对象生命周期的机制。

只有堆分配对象的所有权,通过 、 或类似方式保存和传递std::unique_ptr<T>std::shared_ptr<T>才能清晰地表达和转移。

如果有特别的约定,编译器不强制执行,暗示参数被存储为引用,这将被认为是糟糕的类设计。

您应该考虑以下一般准则:

  • 廉价复制的类型应该被复制。
  • 不可复制的类型应该通过智能指针进行堆分配和传递/拥有。
  • 如果需要与具有独立生命周期的其他对象持久共享,则认为复制“过于昂贵”的类型也应该分配智能指针。

当生命周期不是由 API 用户任意控制时,此堆分配策略存在例外情况,但在您上面描述的场景中则不然。

于 2014-09-03T19:19:49.693 回答