为什么使用此删除的功能有效?

tem*_*boy 4 c++

struct S {
    S() {}
    S (const S &) = delete;
};

void f1 (S s) {}
void f2 (S &s) {}

int main() {
    S s;

    f2(s);
}
Run Code Online (Sandbox Code Playgroud)

既然S(S &s)删除了,为什么使用f2不抛出错误,因为它被声明它传递参数S &s?当我使用f1(s)它时会抛出错误.我已经看过删除函数的定义,我认为这会引发错误,但事实并非如此.为什么?

Luc*_*ore 10

因为通过引用传递不会创建副本(这是f2使用什么).

f1另一方面,它采用pass-by-value参数,该参数进行复制.

  • @ user6607不,你是什么意思.`f2`通过引用获取参数,不涉及任何副本,并且它可以工作.`f1`按值获取参数,尝试复制,但由于复制构造函数被删除而失败.有什么问题? (2认同)

Fik*_*tik 9

让我们来看看S:

struct S {
    S() {}                   // default constructor
    S (const S &) = delete;  // copy-constructor
};
Run Code Online (Sandbox Code Playgroud)

你在这里有一个可以构造但不能复制的类型.

现在让我们来看看你的功能:

void f1 (S s1) {}    // creates a local copy of its parameter
void f2 (S &s2) {}   // takes a reference to the parameter
Run Code Online (Sandbox Code Playgroud)

当你打电话时f1(s),该函数试图创建一个副本s- 但你的类型S禁止复制 - 这就是为什么这不起作用.

当你打电话f2(s)时,函数创建其参数的引用-所以无论你做什么内部f2s2直接对原始对象s.类无法阻止任何人接受对象的引用.