函数 return 应该是新创建的 object 的指针,还是 object 的 unique_ptr?

should a function return the pointer of a newly created object, or a unique_ptr of that object?

我记得几年前看过 Herb Sutter 的会议演讲,试图按照这些思路制定指导方针:

if a function creates a new object on the heap, then it should always return it as a unique_ptr.

当时的想法是这样更安全,intention-revealing。

令我惊讶的是,今天的 CPP 核心指南中似乎缺少此指南。

MyObject *create(Params p) {
  return new MyObject(p);
}

unique_ptr<MyObject> create(Params p) {
  return make_unique<MyObject>(p);
}

To my surprise, this guideline seems to be missing from the CPP core guidelines today.

此指南 C++ 核心指南提供的。本准则与工厂函数有关,工厂函数是主要目的是构造和初始化新对象的函数。

请参阅 C.50: Use a factory function if you need “virtual behavior” during initialization 其中指出:

Note The return type of the factory should normally be unique_ptr by default [...]

它包含在 I11 下的 C++ 核心指南中:

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#i11-never-transfer-ownership-by-a-raw-pointer-t-or-reference-t

你应该做的是:

MyObject create(Params p) {
  return MyObject(p);
}

只有当你绝对需要引用机制时,即当构造一个多态对象并返回一个基数时class,你才应该这样做:

unique_ptr<MyObject> create(Params p) {
  return make_unique<MyObject>(p);
}