make_unique 无法访问静态成员中的私有构造函数

make_unique cannot access private constructor in static member

我的 class 具有以下结构:

class S {
  public:
    S() {}
};

class T {
  private:
    std::unique_ptr<S> a;
    T(S);

  public:
    static std::unique_ptr<T> make_item() {
        std::unique_ptr<S> s_instance = std::make_unique<S>();
        return std::make_unique<T>(std::move(s_instance));
    }
};

但是,当我尝试在 make_item 中创建 unique_ptr 时,它认为构造函数是私有的。

有没有办法允许在 class 本身的静态成员函数中使用私有构造函数?因为一个成员是unique_ptr到S(一个相当重的对象),所以我们不希望使用副本。

正如 yksisarvinen 在评论中提出的那样,解决此问题的方法是将 make_unique<T> 替换为 std::unique_ptr<T>(new T(S))

class S {
  public:
    S() {}
};
class T {
  private:
    std::unique_ptr<S> a;
    T(S);

  public:
    static std::unique_ptr<T> make_item() {
        // Create S
        std::unique_ptr<S> s_instance = std::make_unique<S>();
        return std::unique_ptr<T>(new T(s_instance));
    }
};

可以将 make_unique 及其内部助手(如果有的话)声明为友元函数,这使得代码不可移植(如此处所述:

或者使构造函数 public 但在其参数中添加私有元素,例如:

class S {
  public:
    S() {}
};

class T {
  private:
    struct Private
    { 
      friend T;
      private:
        explicit Private() = default; 
    };

    std::unique_ptr<S> a;

  public:
    T(S s, Private);

    static std::unique_ptr<T> make_item() {
        auto s_instance = std::make_unique<S>();
        return std::make_unique<T>(std::move(s_instance), Private());
    }
};