A mere hateblo

単なるはてブロです。

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の参照先が代わるわけではない。

近頃覚えた参照を得意気に使ってしまい、こうなった。反省。