可以*仅*放在堆栈上的 C++ 类?

标签 c++ stl

如何创建一个 C++ 类,其对象可以作为单个实例放在堆栈上,但是

  • notstd::vector(或其他 std 容器)并且 not 到普通数组,无论它们分配在哪里.
  • 在堆上(答案链接到)
  • 作为另一个对象的成员,如果该对象本身存在于容器或自由存储区中。

备注:How do I prevent a class from being allocated via the 'new' operator? (I'd like to ensure my RAII class is always allocated on the stack.)询问如何避免免费商店,但这只是答案的一半。我猜想(?)对于容器,可以使用 placement-new 运算符做一些类似的事情,但是数组和数据成员情况又如何呢?

该限制应由编译器强制执行。 (没有运行时检查。)

举例:

class User {
  ...
  StackOnly m; // may be OK (depending if below implementable)
};

void f() {
  StackOnly obj; //ok
  StackOnly arrobj[42]; // fail!
  StackOnly* pObj = new StackOnly(); // fail!
  std::vector<StackOnly> v; // fail!

  User obj; //ok
  User arrobj[42]; // fail!
  User* pObj = new StackOnly(); // fail!
  std::vector<User> v; // fail!
}

最佳答案

以下类仅允许:X&& x = X::MakeInstance();const X& x = X::MakeInstance(); 用法:

class X
{
public:
    X(const X&) = delete;
    X(X&&) = delete;
    X& operator =(const X&) = delete;
    X& operator =(X&&) = delete;

public:
    static X MakeInstance() { return {}; }

    static void* operator new     (size_t) = delete;
    static void* operator new[]   (size_t) = delete;
    static void  operator delete  (void*)  = delete;
    static void  operator delete[](void*)  = delete;

private:
    X() = default;
};

关于可以*仅*放在堆栈上的 C++ 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40752556/

相关文章:

c++ - bitwise not操作的编译器优化

c++ - 从 int 到 enum 类类型的转换可能吗?

c++ - pIter != cont.end() 在 for 循环中的性能

c++ - STL Map<string, > 与 LLVM 库冲突

使用 g++ 4.6 和 boost::unordered_map 的 C++11 相关编译错误

c++ - long long int 数组指针 该数组的算法

c++ - 使用 webkitgtk 和 gtkmm 3.0 的例子

C++ Qt QCloseEvent 不起作用

c++ - C++ 中的简单仿函数,STL

c++ - 模板特化 VS 函数重载