新C++編このページの概要このページでは、スコープと名前空間を取り上げます。いずれも、あまり意識しないようにしてきましたが、これまでのページの中ですでに登場している概念です。スコープの概念により、宣言した名前を使用できるコード上の範囲が決まります。これはメモリ上にあるかどうかとはまた別の話であり、正しく理解することが必要です。名前空間は、関連のあるいくつかの機能の集合に名前を付け、ほかのコードから分離することで、変数や関数などの名前が衝突することを防ぎます。要点だけをさっと確認したい方は、「まとめ」をご覧ください。いう用語で表現します。名前が使用できる場合、「スコープ内にある」などといいます。スコープは、名前が使える範囲を意味するものであって、変数(オブジェクト)がメモリ上に存在しているかどうかを意味するものではないことに注意してください。後者を決めるのはストレージ期間でした(「メモリとオブジェクト」のページを参照)。スコープ内にない名前でも、その実体(オブジェクト)はメモリ上に存在している場合があります。静的ローカル変数(「メモリとオブジェクト」のページを参照)が分かりやすい例で、スコープは宣言を行ったブロック内に限定されますが、そのブロックを抜け出したあとでもメモリ上に存在し続けています。厳密なルールは意外と複雑ですが1、基本的に、宣言を行っている文が終わったところが宣言場所と考えて問題ありません。スコープにはいくつかの分類があるので、ここからはそれぞれを順番に紹介していきます。【上級】そのほか、関数tryブロックや、例外ハンドラで宣言した名前もブロックスコープを持ちます。ブロックスコープは、宣言場所ではじまり、そのブロックの末尾で終了します。関数定義の仮引数の場合、宣言場所は関数本体の直前とみなされ、関数全体がスコープになります。ここまで使える}入れ子になったブロックで同じ名前を宣言できます。この場合、内側のブロックで宣言した名前によって、外側で宣言された名前を隠すことになります。隠蔽された名前を使うことはできません。関数プロトタイプスコープは、その宣言を書いたところではじまり、その関数宣言が終わるまでです。関数の戻り値の型を後ろに置く構文(「関数を作る」のページを参照)で宣言するときに、戻り値の型を仮引数の型を使って決定できます。指定した式の最終的な型をコンパイル時に判断し、その結果でコードを置き換えます。decltype(式)コンパイル時に判断を行うだけなので、「式」は実際には実行されることはありません。上記のような戻り値型を記述する場面以外であっても、型名を必要とする箇所でなら多くの場面で使用できます。関数スコープは、宣言場所とは無関係に、その関数の本体すべてです。宣言場所よりも手前であっても使用できます。ラベルはこれまで、switch文で使うものしか登場していませんが、ラベル名を宣言する次の構文があります。文ラベルとは、文に対して付ける名前です。そのため「文」の存在が必要です。場合によっては空文を補わなければなりません。