【发布时间】:2016-01-13 18:24:57
【问题描述】:
如何禁止对象的构造?我将= delete;所有相关特殊功能标记如下:
struct A
{
A() = delete;
A(A const &) = delete;
A(A &&) = delete;
void * operator new(std::size_t) = delete;
void operator delete(void *) = delete;
};
A x{};
A y = {};
A * z = ::new A{};
但x、y 和*z 仍然可以存在。该怎么办?我对这两种情况都感兴趣;静态/堆栈分配和堆分配。
【问题讨论】:
-
不清楚您要做什么。 IFAIK 没有标准的符合标准的方法来创建对象而不构造它(对于非 POD 类型)。
-
@GregorMcGregor 你错了coliru.stacked-crooked.com/a/b43ee3e03590be79。
-
此代码不是有效的 C++。如果 clang 编译它,那是 clang 的问题,而不是 C++ 的问题。提交一个针对 clang 的错误。 Gcc rejects the code as it should.
-
@n.m.实际上,我认为这是一个 GCC 错误。这三种形式都应该是聚合初始化,不调用默认构造函数。
-
@TartanLlama 哎哟你是对的。它是一个聚合体。我的错!
标签: c++ c++11 memory-management c++14 memory-layout