"attempting to reference a deleted function" 用于复制构造函数
"attempting to reference a deleted function" for copy constructor
我正在努力了解 5 法则。
我有一个 class Renderable
,它定义了一个自定义析构函数,所以它似乎是 5 规则的一个很好的候选者。这个 class 在它的构造函数中创建了一些资源,所以我的第一个想法是我应该防止复制:
class Renderable {
public:
Renderable(const Sprite&) {
// Allocate resources
}
~Renderable() {
// Free resources
}
// Prevent copying
Renderable(const Renderable& other) = delete;
}
我有另一个 class、Unit
,它在其构造函数的初始化列表中创建一个 Renderable
:
class Unit {
public:
Unit(const Sprite& sprite) :
renderable(Renderable(sprite)) {}
private:
Renderable renderable;
}
我希望这会调用常规的 Renderable
构造函数,但我得到了错误:
Renderable::Renderable(const Renderable &)': attempting to reference a deleted function
为什么要调用拷贝构造函数?
我什至尝试向复制构造函数添加调试行,但没有打印任何内容:
Renderable(const Renderable& other) : sprite(other.sprite) {
std::cout << "copy constructor";
}
首先,Renderable(sprite)
创建一个 Renderable
。然后你尝试用 Renderable
构造 renderable
。从概念上讲,除了复制构造函数,它还能用什么?
为什么要创建一个 Renderable
来初始化 renderable
?该步骤不需要并且不会起作用,因为您没有复制构造函数。您明确表示您不希望概念上使用复制构造函数的代码起作用。
Why is this trying to call the copy constructor?
因为
renderable(Renderable(sprite)) {}
这构造了一个临时的Renderable
对象,然后用它来构造renderable
class成员。那将是
I even tried added debug lines to the copy constructor, but nothing is
printed:
这是因为这是允许编译器进行复制省略的情况之一。即使编译器优化了临时+复制构造,构造函数仍然必须存在。 class 的某些内容导致默认复制构造函数被删除。这可能有多种原因,但您没有提供足够的信息来确定您的 class 可能是什么原因。
除了别人说的,我想你的意思是:
Unit::Unit(const Sprite& sprite) :
renderable(sprite) {}
这会调用转换构造函数 Renderable(const Sprite&)
直接初始化 renderable
,不涉及复制。
我正在努力了解 5 法则。
我有一个 class Renderable
,它定义了一个自定义析构函数,所以它似乎是 5 规则的一个很好的候选者。这个 class 在它的构造函数中创建了一些资源,所以我的第一个想法是我应该防止复制:
class Renderable {
public:
Renderable(const Sprite&) {
// Allocate resources
}
~Renderable() {
// Free resources
}
// Prevent copying
Renderable(const Renderable& other) = delete;
}
我有另一个 class、Unit
,它在其构造函数的初始化列表中创建一个 Renderable
:
class Unit {
public:
Unit(const Sprite& sprite) :
renderable(Renderable(sprite)) {}
private:
Renderable renderable;
}
我希望这会调用常规的 Renderable
构造函数,但我得到了错误:
Renderable::Renderable(const Renderable &)': attempting to reference a deleted function
为什么要调用拷贝构造函数?
我什至尝试向复制构造函数添加调试行,但没有打印任何内容:
Renderable(const Renderable& other) : sprite(other.sprite) {
std::cout << "copy constructor";
}
首先,Renderable(sprite)
创建一个 Renderable
。然后你尝试用 Renderable
构造 renderable
。从概念上讲,除了复制构造函数,它还能用什么?
为什么要创建一个 Renderable
来初始化 renderable
?该步骤不需要并且不会起作用,因为您没有复制构造函数。您明确表示您不希望概念上使用复制构造函数的代码起作用。
Why is this trying to call the copy constructor?
因为
renderable(Renderable(sprite)) {}
这构造了一个临时的Renderable
对象,然后用它来构造renderable
class成员。那将是
I even tried added debug lines to the copy constructor, but nothing is printed:
这是因为这是允许编译器进行复制省略的情况之一。即使编译器优化了临时+复制构造,构造函数仍然必须存在。 class 的某些内容导致默认复制构造函数被删除。这可能有多种原因,但您没有提供足够的信息来确定您的 class 可能是什么原因。
除了别人说的,我想你的意思是:
Unit::Unit(const Sprite& sprite) :
renderable(sprite) {}
这会调用转换构造函数 Renderable(const Sprite&)
直接初始化 renderable
,不涉及复制。