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

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

int main() {
    S s;

    f2(s);
}

は削除されているため、宣言されたときに引数が渡されるため、S(S &s)使用するとエラーがスローされないのはなぜですか? 使用するとエラーになります。私は削除された関数の定義を見てきましたが、これはエラーになると思いましたが、そうではありません。なんで?f2S &sf1(s)

4

2 に答える 2

10

参照渡しではコピーが作成されないためです(これがf2使用されます)。

f1一方、 はコピーを作成する値渡しパラメーターを取ります。

于 2012-08-24T13:13:15.800 に答える
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で行うことはすべてs2、元のオブジェクトに対して直接行われますs。誰かがオブジェクトを参照するのをクラスが防ぐことはできません。

于 2012-08-24T13:27:10.567 に答える