struct Example{
    class token{
    private:
        token(){}
        friend Example;
    };

    static std::shared_ptr<Example> create(){
      return std::make_shared<Example>(token{});
    }

    Example(token) : Example() {
    }

private:
    Example(){}
};

int main() {
  Example d{}; //compile error
  Example d(token{}); //compile error
  auto ptr = Example::create(); //ok
}


备份地址: 【限制对象在堆上创建