在基本构造函数中初始化唯一指针的标准容器

Initialize standard container of unique pointers in base constructor

假设容器及其内容在编译时已知,在基本构造函数中初始化唯一指针的标准库容器的首选方法是什么? C++ 不允许将初始化列表与唯一指针一起使用,因为它们会强制进行复制操作,所以我目前正在使用丑陋的 lambda 解决方法:

#include <memory>
#include <vector>
#include <string>
using namespace std; // Note: for readability only

// Some non-POD object
class Object {
public: 
    Object(const string& desc) : description(desc) { }
    string description;
    void func () { /* do stuff */ }
};

// This class stores a vector of unique pointers to objects
class BaseX {
public:
    const vector< unique_ptr<const Object> > objects;
    BaseX (vector< unique_ptr<Object> > vec) : 
        objects { make_move_iterator(vec.begin()), make_move_iterator(vec.end()) } { }
};

// This class is a special case of BaseX where the object definitions are constant, and known at compile time (static).
// Question is how to initialize them...
class DerivedX : public BaseX {
public:
    DerivedX () : BaseX(
        // Using a lambda function is a messy idea, but works
        []()->vector< unique_ptr<Object> > {
            unique_ptr<Object> objects[] = {
                make_unique<Object>("My object")
            };
            return { make_move_iterator(begin(objects)), make_move_iterator(end(objects)) };
        }()
    ) { }
};

这似乎是static应该使用某些东西的情况,但不确定它适合的位置...

我可能会这样做:

class DerivedX : public BaseX {
public:
  DerivedX () : BaseX(make_vec()) { }

private:
  static auto make_vec()
  {
    std::vector<std::unique_ptr<const O>> v(2);
    v[0] = std::make_unique<O>("1");
    v[1] = std::make_unique<O>("2");
    return v;
  }
};

(使用 auto return 类型,因为如果你有 make_unique,你似乎在使用 C++14,如果你使用 C++11,那么只需拼写return 明确输入。)