2006年01月31日

リファレンスの初期化

ここで、リファレンスの初期化についてもう少し詳しく見ていくことにしましょう。

まず、const でない T 型のリファレンスを初期化する場合ですが、この場合の右辺には以下のように T 型の左辺値だけが許されます。

001 int test();
002
003 void f()
004 {
005 int i;
006 unsigned int ui;
007 long l;
008
009 int& r1 = i; // OK. i は int 型の左辺値。
010 int& r2 = r1; // これも OK.
011 int& r3 = ui; // error. unsigned int は int じゃない。
012 int& r4 = l; // error. long も int じゃない。
013 int& r5 = test(); // error. 一時変数は左辺値じゃない。
014 int& r6 = 3; // error. 定数は左辺値じゃない。
015 }

ちなみに、左辺値かどうかは、値を代入することができるかどうかで判断します。13,14行目のような一時変数や定数は値を代入することができませんので、それらは左辺値でないことが分かります。

const でない T 型のリファレンスを初期化できるのは、T 型の変数か const でない T 型のリファレンスだけでした。それに対し、const T& は様々な値で初期化することができます。T 型に変換することができれば T 型でなくてもかまいませんし、一時変数や定数でもかまいません。

001 int test();
002
003 void f()
004 {
005 int i;
006 unsigned int ui;
007 long l;
008
009 const int& r1 = i; // OK.
010 const int& r2 = r1; // OK.
011 const int& r3 = ui; // OK.
012 const int& r4 = l; // OK.
013 const int& r5 = test(); // OK.
014 const int& r6 = 3; // OK.
015 }

また、13行目の r5 にはテンポラリオブジェクトの寿命に関する興味深い点があります。test() の戻り値のようなテンポラリオブジェクトの寿命は、式の終わり(つまり13行目のセミコロン)までとなっているはずです。ところが r5 は14行目以降でも問題なく使うことができます。つまり、テンポラリオブジェクトを const なリファレンスで参照することによって、そのテンポラリオブジェクトの寿命を延ばすことができるのです。この点に関しては、「const なリファレンスの初期化によるテンポラリオブジェクトの延命」にて詳しく説明したいと思います。

最後に、const なリファレンスを初期化できない例として、volatile の使用を挙げておきます。

001 void f()
002 {
003 volatile int vi = 1;
004 const volatile int cvi = 2;
005
006 const int& r1 = vi; // error. volatile な変数では初期化できない。
007 const int& r2 = cvi; // error. volatile は const であっても信用できない。
008 const volatile int& r3 = vi; // OK.
009 const volatile int& r4 = cvi; // OK.
010 }

volatile は「移り気な・気まぐれな」という意味のとおり、文脈とは関係のないところで変化するかも知れない変数を意味します。よく、最適化の対象にならない変数という解説を見かけますが、勝手に変化するかもしれないから結果的に最適化できないだけのことです。どちらにしろ volatile を使うことは稀かと思いますが、もし使う場合にはきちんと volatile をつけて参照するようにしましょう。
posted by シンビアン at 09:13| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/12544401

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。