【问题标题】:What does prohibiting value semantics in C++ mean?在 C++ 中禁止值语义是什么意思?
【发布时间】:2023-03-05 10:31:02
【问题描述】:
我有以下代码:
template<typename T>
class derClass : public baseClass<column<T>, column<k>>
{
//prohibit value semantics
derClass(const derClass&) = delete;
derClass& operator= (const derClass&) = delete;
public:
...
}
这段代码有很多地方看不懂:
- 这些
delete 是什么意思?我没有看到 delete 变量的任何声明。
- 为什么我们需要一个将同一类的对象作为参数的构造函数?
- 这整行是什么意思:
derClass& operator= (const derClass&) = delete;
【问题讨论】:
标签:
c++
syntax
constructor
semantics
delete-operator
【解决方案1】:
这里的delete 是new C++11 thing,告诉编译器这些方法不存在。否则编译器会创建它们的默认版本。
获取自身类的常量引用的构造函数是复制构造函数。复制构造函数的用途应在任何有关 C++ 的初学者文本中进行说明。
由于现在删除了复制构造函数和复制赋值运算符,这意味着您无法从derClass 的另一个实例创建derClass 的实例。
【解决方案3】:
值语义是当您的对象表现得像值时:当您将它分配给另一个对象时,第二个对象将具有相同的值,当您首先更改时,第二个对象保持不变。另一种情况是引用语义——当你第一次改变时——第二次改变。
构造函数,取同一个类的引用是复制构造函数,它只是复制对象。第二个定义是赋值运算符。当您将它们标记为 delete 时 - 无法复制和分配您的对象。
【解决方案4】:
- C++11 语法本质上表示“此类没有 X”,其中 X 首先是复制构造函数,其次是复制赋值运算符。
- 它是一个复制构造函数。这在任何 C++ 入门书籍中都有解释。
- 它是一个复制赋值运算符。这在任何 C++ 入门书籍中都有解释。
总的来说,使用这些deleted 特殊函数意味着您不能复制该类的实例,或复制分配给它们:
derClass d1, d2;
derclass d3{d1}; // ERROR: cannot copy
d2 = d1; // ERROR: cannot copy-assign