提问人:Dan 提问时间:8/23/2019 最后编辑:Dan 更新时间:8/28/2019 访问量:702
复制构造函数的“尝试引用已删除的函数”
"attempting to reference a deleted function" for copy constructor
问:
我试图绕过 5 法则。
我有一个类,它定义了一个自定义析构函数,所以它似乎是 5 规则的一个很好的候选者。这个类在其构造函数中创建了一些资源,所以我的第一个想法是我应该防止复制:Renderable
class Renderable {
public:
Renderable(const Sprite&) {
// Allocate resources
}
~Renderable() {
// Free resources
}
// Prevent copying
Renderable(const Renderable& other) = delete;
}
我还有另一个类,它在其构造函数的初始值设定项列表中创建一个:Unit
Renderable
class Unit {
public:
Unit(const Sprite& sprite) :
renderable(Renderable(sprite)) {}
private:
Renderable renderable;
}
我希望这会调用常规构造函数,但相反,我收到错误:Renderable
Renderable::Renderable(const Renderable &)':尝试引用已删除的函数
为什么这试图调用复制构造函数?
我什至尝试将调试行添加到复制构造函数中,但没有打印任何内容:
Renderable(const Renderable& other) : sprite(other.sprite) {
std::cout << "copy constructor";
}
答:
首先,创建一个 .然后你试着用它来构造。从概念上讲,除了复制构造函数之外,还能使用什么?Renderable(sprite)
Renderable
renderable
Renderable
为什么要创建一个初始化?该步骤不是必需的,并且不起作用,因为您没有复制构造函数。您已经明确表示,您不希望在概念上使用复制构造函数的代码工作。Renderable
renderable
评论
renderable
sprite
为什么这试图调用复制构造函数?
因为
renderable(Renderable(sprite)) {}
这将构造一个临时对象,然后使用它来构造类成员。那将是一个Renderable
renderable
我什至尝试在复制构造函数中添加调试行,但什么都没有 印刷:
这是因为这是允许编译器执行复制省略的情况之一。即使编译器优化了临时+复制构造,构造函数也必须仍然存在。有关该类的某些内容会导致删除默认的复制构造函数。这可能有几个原因,但你没有提供有关你的班级的足够信息来确定可能的原因是什么。
评论
Renderable(const Renderable& other) = delete;
"copy constructor"
除了别人说的,我想你的意思是写:
Unit::Unit(const Sprite& sprite) :
renderable(sprite) {}
这将调用转换构造函数直接初始化,不涉及复制。Renderable(const Sprite&)
renderable
评论
Renderable
评论
Unit::Unit(const Sprite& sprite) : renderable(sprite) {}