C++の参照の使い方を間違えた
C++の参照を「ポインタと見た目が違うだけで似たようなもの」などと覚えたせいでバグを作ってしまった。なんだかくやしいので、未来の自分に対して書き留めておく。
例えばポインタを使った例として、こう書いて:
#include <iostream> int main() { int a = 1; int b = 2; int *c = &a; c = &b; std::cout << "a = " << a << ", b = " << b << std::endl; return 0; }
コンパイルして実行すると標準出力にはa = 1, b = 2
と出力される。これは正しい。
それをそっくり参照でも置き換えられると考えていた。そこでこう書いて:
#include <iostream> int main() { int a = 1; int b = 2; int &c = a; c = b; std::cout << "a = " << a << ", b = " << b << std::endl; return 0; }
コンパイルして実行すると標準出力にはa = 2, b = 2
と出力される。これはおかしいと思った。
int &c = a
まではいいが、次のc = b
はいけない。これは参照先の挿げ替えではなく値のコピーだ。c = b
で変数cの参照先が代わるわけではない。
近頃覚えた参照を得意気に使ってしまい、こうなった。反省。