"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对象,然后用它来构造renderableclass成员。那将是

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,不涉及复制。

Live demo