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

时间:2012-08-24 13:11:51

标签: c++

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

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

int main() {
    S s;

    f2(s);
}

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

2 个答案:

答案 0 :(得分:10)

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

另一方面,

f1采用pass-by-value参数进行复制。

答案 1 :(得分:9)

让我们看看S

struct S {
    S() {}                   // default constructor
    S (const S &) = delete;  // copy-constructor
};

这里有一个可以构建但不能复制的类型。

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

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

当您致电f1(s)时,该功能会尝试创建s的副本 - 但您的类型S禁止复制 - 这就是为什么这不起作用。

当您致电f2(s)时,该函数会创建对其参数的引用 - 因此,f2 s2s所做的任何操作都会直接对原始对象{{1}}完成。类无法阻止任何人接受对象的引用。