いいえ、あなたは参照を再座席することはできません。
は考えてみましょう:
int a = 42, b = 43;
int &ar = a;
ar = b;
はどのようにコンパイラを使用すると、b
を参照するためにar
を取り付け直ししようとしていることを知っている、と43
にa
の値を設定することはできませんか?
この「問題」は、参照ではなくポインタを使用して解決します。
EDIT:あなたの編集パー、
OKはので、私はあなたが罰金、 参照してクラスの代入演算子を使用することはできません聞いています。しかし、なぜビジュアルスタジオは私にそれをさせるのですか? プログラムが実行されます。
あなたの結論の前提は間違っています。 は、参照を含むクラスで代入演算子を使用します。あなたがすることができないことは、参照を再座らせることです。上のコードで説明したように、ar = a;
を使用して参照を再割り当てしようとすると、ar
が何を参照するのかはわかりませんが、ar
の値を変更します。
Visual Studioで「することができます」ということは難しくありません。誤解は、Visual Studioがあなたに任せていることです。それはあなたが参照を再座らせることを許可していません。それはあなたが参照の価値を変更させるものです。これが意味するものを明確にすることを望む例がここにあります。
#include <iostream>
#include <string>
using namespace std;
class Foo
{
public:
void dump() const
{
cout << "Foo instance " << showbase << this << "\n";
}
};
class Bar
{
public:
Bar(Foo& foo) : foo_(foo) {}
Bar& operator=(const Bar& rhs)
{
foo_ = rhs.foo_;
return * this;
}
void dump() const
{
cout << showbase << "Bar instance " << this << "\t";
foo_.dump();
}
private:
Foo& foo_;
};
int main()
{
cout << "foo1: ";
Foo foo1;
foo1.dump();
cout << "foo2: ";
Foo foo2;
foo2.dump();
cout << "bar1 :";
Bar bar1(foo1);
bar1.dump();
cout << "bar2 :";
Bar bar2(foo2);
bar2.dump();
bar2 = bar1;
cout << "bar2 after assign :";
bar2.dump();
}
上記のコードは2つのFoo
オブジェクト(foo1
とfoo2
)を確立し、異なるFoo
への参照をそれぞれ有する2つのBar
オブジェクトを作成します。 Bar
は、次のことを実行する、operator=
があります
foo_ = rhs.foo_;
C++はfoo_
が今Foo
の別のインスタンスを参照することになり、あなたがこの方法で再座席の参照をすることができます。しかし、それはしません。これはfoo_
が何を参照するかを変更しません。代わりにFoo
のoperator=
が呼び出されます。上記のコードを実行すると、Foo
のアドレスがbar2
に変更されないことがわかります。参照を再配置できる場合は、参照が変更されます。
サイドノート:コピースワップイディオムを使用すると、 '&rhs!= this'チェックは冗長です(http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-イディオム)。 –
@SirYakalot:私の編集をご覧ください。私はこれがあなたのために物事を明確にすることを望む。 –