如何创建一个 C++ 类,其对象可以作为单个实例仅放在堆栈上,但是
- not 到
std::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/