7
2019 年
月 1 日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格(日本産業規格)」を「日本産業規格」に読み替えてください。
かし ,その( 実際の)有効範囲は,
から までを除いたものとなる。 の第 の宣言( & の直前にある
)の宣言領域は, から までの部分となる。しかし,その潜在有効範囲には, の宣言が含まれない。
の第 の宣言の有効範囲は,その潜在有効範囲に等しい。
宣言は,そこで宣言している名前を,その宣言が現れている有効範囲に導入する。ただし,3 指定子( ),
( ) 及び 《
《詳述型指定子》 ! ( ) )によってこの原則が外れることがある。
指令》
単一の宣言領域にあって,同じ修飾なしの名前を対象としている複数の宣言については,次の制約がある。
― すべての宣言が同じ実体を参照しているか,すべての宣言が関数 又は 関数テンプレートを参照している
かでなければならない。
― その中の一つの宣言だけが,型定義名でないクラス名 又は 列挙体名を宣言していて,しかも,他の宣言
がすべてその同じクラス 又は 列挙子を参照しているか,関数 又は 関数テンプレートを参照しているかで
なければならない。この場合,そのクラス名 又は 列挙体名は,隠ぺい状態( ) )となる。
参考 名前空間名 又は クラステンプレート名は,宣言領域の中で唯一となっていなければならな
い( ) 及び 参照)。
参考 これらの制約は,名前を導入する対象の宣言領域に適用する。この宣言領域は,宣言が現れている領域
と必ずしも一致しない。特に, ( ) 及び 随伴宣言( )は,それを囲んでいる名
《詳述型指定子》
前空間に名前( 可視でなくてもよい。)を導入することがある。こうした場合,これらの制約は,その名
前空間に適用される。局所的な ・ 宣言( # )は,その宣言のある宣言領域に名前を導入するととも
に,それを囲んでいる名前空間にも名前( 可視でなくてもよい。)を導入することがある。こうした場合,
これらの制約は,この二つの領域ともに適用される。
参考 名前検索については, に規定する。
宣言位置 名前の宣言位置1 3 (
は,原則として,その完全な《宣言子》 )の直後であっ
( もしあれば )の直前をいう。
て,その《初期化子》
例 % L+&
Q % & R
この 番目の は,自分自身の( 定まらない)値を使って初期化を行っている。
参考 局所的でない名前は,それを隠ぺいする局所的な名前の宣言位置まで可視のままでいる。
例 % +&
Q ST& R
この宣言は, 個の整数からなる配列を宣言する。
列挙子の宣言位置は,その《列挙子定義》の直後とする。
例 % L+&
Q Q % R& R
列挙子 は,定数 の値,すなわち を使って初期化している。
クラスメンバは,その宣言位置の後で,そのクラスの有効範囲内で名前検索することができる。
参考 これは,そのクラスが不完全クラスであっても成り立つ。
例 5 Q
8 Q $ % L- R&
S533$T& '' B>
R
《詳述型指定子》を使って最初に宣言したクラスの宣言位置は,次のとおりとする。
― :《クラスキー》 《識別子》 &; の形をした《詳述型指定子》の場合,この《詳述型指定子》は,その《識
別子》を,この宣言を含む有効範囲の中でのクラス名として宣言する。
― :《クラスキー》 《識別子》; の形をした《詳述型指定子》の場合,この《詳述型指定子》が,名前空間
有効範囲で定義される関数の《宣言指定子列》 又は 《仮引数宣言節》の中に現れているとき,この《詳
述型指定子》は,その《識別子》を,その宣言を含む名前空間での《クラス名》として宣言する。そうで
ない場合,随伴宣言でない限り,その《識別子》を,その宣言を含む最小の( クラスでも関数原型でもな
い)有効範囲内に宣言する。
参考 この《詳述型指定子》が列挙体を指している場合,その《識別子》は,すでに宣言してある
《列挙体名》を参照していなければならない。この《詳述型指定子》の《識別子》が《修飾付き
――――― [JIS X 3014 pdf 21] ―――――
識別子》である場合,その《識別子》は,すでに宣言してある《クラス名》 又は 《列挙体名》
を参照していなければならない( 参照) 。
参考 随伴宣言は,それを囲む最小の名前空間のメンバとなっている関数 又は クラスを参照しはするが,その
名前空間に新しい名前を導入しはしない( ) 参照)。ブロック有効範囲での,関数宣言 及び
・
指定子付きのオブジェクト宣言は,それを囲む名前空間のメンバを参照するだけで,その有効範囲に新し
い名前を導入しはしない。
参考 テンプレートの具現化位置については,( で規定する。
局所的な有効範囲 ブロック( ( )内に宣言した名前は,そのブロックに局所的
であるという。そ
の潜在有効範囲は,その宣言位置( )から始まり,その宣言領域の終わりまでとする。
関数定義( )内の関数仮引数名の潜在有効範囲は,その宣言位置から始まる。その関数に《関数監視ブロック》
がある場合,潜在有効範囲は,それに付随する最後のハンド ラの終わりまで広がる。そうでない場合,その関数宣言
《関数監視ブロック》
の最外側のブロックの終わりまで広がる。仮引数名は,その関数宣言の最外側のブロックでも,
に付随するハンド ラの最外側のブロックでも,再宣言してはならない。
例外宣言の中の名前は,そのハンド ラに局所的であるという。この名前は,その処理部の最外側のブロック
で再宣言してはならない。
《 初期化文》の中 並びに 文,< 文, 文 及び !< 文の《条件》の中で宣言した名前は,その
文,
< 文, 文 及び !< 文(その本体となっている文も含む。)に局所的であるという。これらの名前は,その文
の以後の条件 及び その本体となっている文の最外側のブロック( 文にあっては,すべての最外側のブ ロック)で
再宣言してはならない( ( 参照)
。
関数原型有効範囲 関数宣言の中の仮引数の名前,又は 関数定義の宣言子ではない関数宣言子の中の仮引数
の名前( もしあれば )は,関数原型有効範囲をもつ。関数原型有効範囲は,それを囲む最小の関数宣言子の終わりま
で広がる。
関数有効範囲 ラベル( ( )は,関数有効範囲をもつ。ラベルは,それが宣言してある関数の中であればど
こででも使うことができる。ラベルだけが,関数有効範囲をもつ。
# 名前空間有効範囲 《原名前空間名》が表す潜
《名前空間定義》の宣言領域は,その《名前空間本体》とする。
在有効範囲は,その《原名前空間名》をもった元の宣言領域の中に現れるそれぞれの《名前空間定義》の宣言領域を
《名前空間本体》の中で宣言した実体を,その名前空間のメンバ
連結したものとなる。 % という。これらの
宣言がその名前空間の宣言領域に導入する名前を,その名前空間のメンバ名という。名前空間メンバ名は,名前空間
有効範囲をもつ。その潜在有効範囲には,その名前空間内の,その メンバの名前の宣言位置以降の部分が含まれる。
メンバの名前空間を指定した《! ( ) )それぞれに対して,そのメンバの潜在有効範囲には,そのメン
指令》
バの宣言位置に続くその《 ! 指令》の,潜在有効範囲の部分が含まれる。
例 A Q
&
Q & R
&
&
R
Q %L& R
'' の潜在有効範囲は,その宣言位置から
'' 翻訳単位の終わりまでとなる。
A Q
'' A33 を多重定義している。
Q
)& '' は,名前なし名前空間にある。
R
& '' 誤り3 二重定義
& '' B>3 関数宣言の重複
'' B>3 A33 の定義
Q
& '' A33 の呼出し
R
& '' 誤り3 返却値型が違う。
R
――――― [JIS X 3014 pdf 22] ―――――
7
2019 年
月 1 日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格(日本産業規格)」を「日本産業規格」に読み替えてください。
名前空間のメンバは,その名前空間の名前 又は 《
! 指令》の中でそのメンバの名前空間を指名した名前空間の
名前に続く有効範囲解決演算子 33 ( # )の後でも参照することができる( 。
参照)
翻訳単位の最外側の宣言領域も名前空間となり,大域的名前空間
% !1 と呼ぶ。大域的名前空間で宣
言された名前は,大域的名前空間有効範囲( 大域的有効範囲ともいう。)をもつ。こうした名前の潜在有効範囲は,そ
の宣言位置( )に始まり,その宣言領域である翻訳単位の終わりで終わる。大域的名前空間有効範囲をもつ名前
を,大域的 % であるという。
( クラス有効範囲 クラスの中で宣言した名前の有効範囲は,次の原則による。
クラスの中で宣言した名前の潜在有効範囲は,その名前の宣言子に続く宣言領域に加えて,そのクラスの
中( 入れ子になったクラスの中も含む。)の,すべての関数本体,省略時実引数 及び 《コンストラクタ初
期化子》を含む。
クラス の中で挙用している名前 は,その文脈においても,再評価の際の の完全な有効範囲におい
ても,同じ宣言を参照していなければならない。この規則に対する違反については,診断の必要はない。
クラスの中でそのメンバの宣言を並べ替えると,上の ) 及び )の下で別の正当なプログラムとなる場
合,プログラムは,不適格とする。診断の必要はない。
メンバ関数の中で宣言した名前は,同じ名前に対する宣言で,その有効範囲がそのメンバ関数のクラスの
終わりまで 又は それ以上に広がっているものを隠ぺいする。
# クラス定義の終わりまで広がる潜在有効範囲をもつ宣言は,その( クラスの)メンバ定義の宣言領域まで
もその潜在有効範囲に含む。これは,これらのメンバの定義が字句の列としてそのクラスの中にない場合
[静的データメンバ定義,入れ子になったクラス定義,メンバ関数定義(その関数本体も含む。コンストラ
クタ関数( )の場合は, (
《コンストラクタ初期化子》 ( )も含む。)など ]にも成り立つ。更に,
《仮引数宣言節》 及び すべての省略時実引数を
その識別子に続くこれらの定義の宣言子の部分すべても,
含めて,その潜在有効範囲に含む。
例 &
Q % L R&
5 Q
ST& '' 誤り3 は 33 を参照している。
'' 再評価すると 533 を参照する。
Q $ & R '' B>3 533
&
Q % + R&
R&
! &
J Q
& '' 誤り3 は 33 を参照している。
'' 再評価すると J33 を参照する。
&
&
R&
<&
# Q
< <& '' 誤り3 並べ替えが生じないにもかかわらず誤り。
R&
クラスメンバの名前は,次の場合にだけ挙用することができる。
― そのクラス 又は そのクラスから派生したクラス( )の有効範囲の中
― # )の直後
そのクラス 又は そのクラスから派生したクラスの型をもつ式を演算対象とする演算子 ( ( #
― そのクラス 又は そのクラスから派生したクラスのオブジェクトへのポインタを演算対象とする演算子 V
( # # )の直後
― そのクラス 又は そのクラスから派生したクラスの名前を演算対象とする有効範囲解決演算子 33 ( # )
の直後
――――― [JIS X 3014 pdf 23] ―――――
) 名前の隠ぺい 名前は,入れ子になった宣言領域 又は 派生クラスの中で,それと同じ名前を明示的に宣言す
ると隠ぺい 3 することができる( 。
参照)
クラス名( * ) 又は 列挙体名( )
)は,同じ有効範囲の中で,同じ名前をオブジェクト,関数 又は 列挙子とし
て宣言すると隠ぺいすることができる。クラス名 又は 列挙体名と,オブジェクト,関数 又は 列挙子とが,同じ有効
範囲の中で( 順序を問わない。)宣言してある場合,そのクラス名 又は 列挙体名は,オブジェクト名,関数名 又は
列挙子名が可視である場所では常に隠ぺいされる。
メンバ関数定義の中で,局所的な名前の宣言は,そのクラスの同じ 名前をもつメンバの宣言を隠ぺいする( (
。派生クラス( )の中でのメンバの宣言は,基底クラスの同じ名前をもつメンバの宣言を隠ぺいする(
参照)
。
参照)
《
名前空間名で修飾した名前の名前検索において,
! 指令》によって可視にしようとした宣言も,その《
! 指
令》を含む名前空間の中の同じ名前に対する宣言によって隠ぺいされることがある( 。
参照)
名前は,有効範囲の中にあって隠ぺいされていないとき,可視
0!% であるという。
名前検索 名前検索の規則は,文法がその文脈での名前の出現を許している限り,すべての名前[《型定義名》
( ) ), ( * )を含む。]に対して一様に適用する。名前検索は,名前の
( ) ) 及び 《クラス名》
《名前空間名》
挙用をその名前の宣言( )に結びつける。名前検索は,原則として,その名前に一意な宣言を結びつける。ただ
し ,その名前が関数名である場合は,複数の宣言を結びつけることがある。このとき,これらの宣言は,多重定義関
数( )をなすと呼ぶ。多重定義解決( )は,名前検索が成功してから行う。アクセス規則( )は,名前
検索 及び 多重定義解決( 適用できるなら )が成功してはじめて適用する。名前検索,関数の多重定義解決( 適用で
きるなら ) 及び アクセス検査がすべて成功してはじめて,その名前の宣言から得た属性を用いて,その後の式の処
理( # )を行う。
式が現れた有効範囲の中で修飾なしの名前に対して名前検索を行うことを,:式の文脈での名前検索; と呼ぶ。
クラス( * )の補正クラス名も,名前の隠ぺい 及び 名前検索においては,そのクラスのメンバとして扱う。
参考 結合については,# で規定する。有効範囲,宣言位置 及び 名前の隠ぺいについては, で規定する。
修飾なし名前の名前検索 ここでの名前検索は,いずれも,それぞれの分類ごとに示した順に有効範囲を調べ
ていって宣言を見つけ出す。名前に対する宣言が見つかった時点で,名前検索が終了する。宣言が見つからない場合,
そのプログラムは,不適格とする。
《 ! 宣言》があると,その《! 宣言》を囲む名前空間の中では,その《! 宣言》で指名した名前空間の
宣言が可視となる( ) 参照) 《
。ここでの修飾なし名前の名前検索の規定においては,! 宣言》で示した名前空
間の宣言もこの囲む名前空間のメンバとして扱う。
関数呼出しとしての《後置式》で挙用している修飾なし名前の名前検索は, で規定する。
参考 ( 構文解析の中での )式が関数呼出しとしての《後置式》であるかど うかの判定には,通常の名前検索
規則を適用する。 の規則は,式の構文上の解釈には影響しない。
例 &
6 Q
6 0 &
&
6 Q
&
R
R&
式 は, と同等な《キャスト式》となる。この式が関数呼出しではないことか
ら,実引数依存の名前検索( )が適用されることはなく,したがって,随伴関数 を見つ
け出すこともない。
関数,クラス 及び 利用者宣言の名前空間の外側にある大域的有効範囲の中で挙用している名前は,その大域的有
効範囲の中で挙用に先立って宣言していなければならない。
関数定義 及び クラス定義の外側にある利用者宣言の名前空間の中で挙用している名前は,その名前空間の中 又は
その名前空間を囲む名前空間の中で挙用に先立って宣言していなければならない。
名前空間 (ここでは, に大域的有効範囲も含めて考える。)のメンバである関数の《宣言子識別子》の後に現
れる関数定義の中で挙用している名前 は,次のいずれかでなければならない。
注 《仮引数宣言節》の中の型 若しくは 省略時実引数の名前,
関数の《宣言子識別子》に続く修飾なしの名前を指す。こうした名前には,
又は 関数本体の中で挙用している名前がある。
――――― [JIS X 3014 pdf 24] ―――――
7
2019 年
月 1 日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格(日本産業規格)」を「日本産業規格」に読み替えてください。
― 挙用に先立って,挙用しているブロックの中 又は それを囲むブロック( ( )の一つの中で宣言してある。
― 挙用に先立って,名前空間 の中で宣言してある。
― が入れ子の名前空間である場合,挙用に先立って, を囲む名前空間の一つの中で宣言してある。
例 6 Q
A Q
&
R
R
633A33 Q
% /&
'' の宣言を探すのには次の有効範囲を順に見ていく
'' L 633A33 の最外側のブロック有効範囲,挙用の前だけ
'' + 名前空間 A の有効範囲
'' * 名前空間 6 の有効範囲
'' M 大域的有効範囲,633A33 の定義の前だけ
R
クラス の定義が,メンバ関数の本体の外側 又は 入れ子になったクラス定義の外側にある場合,その定義の中で
挙用している名前 は,次のいずれかを満たしていなければならない。
― その挙用に先立ってクラス の中で宣言してあるか, の基底クラス( )のメンバとして宣言して
ある。
― がクラス に入れ子になっている( *) )場合,
の中での の定義に先立って宣言してあるか,の
基底クラスのメンバとして宣言してある(この検索は,を囲んでいるクラスにも最内側のものから順に
適用する。
― が局所クラス( *)である場合,又は が局所クラスに入れ子になったクラスである場合,クラス
の定義に先立って,その定義を囲んでいるブロックで宣言してある。
― が名前空間 のメンバである場合, が名前空間 のメンバであるクラスに入れ子になったクラスで
が局所クラス 又は 入れ子になっ
ある場合,又は 名前空間 のメンバである関数に局所クラスの中で,
たクラスである場合,クラス の定義に先立って,名前空間
の中 又は を囲む名前空間の一つの中
で宣言してある。
例 @ Q
" Q R&
R
A Q
J 3 @33" Q
5 Q
ST&
R&
R&
R
'' に対する宣言を探しに,次の範囲を順に調べる
'' L クラス A33J335 の中, の挙用の前だけ
'' + クラス A33J の中,A33J335 の定義の前だけ
'' * A33J の基底クラスである @33" の中
'' M 名前空間 A の中,A33J の定義の前だけ
'' / 大域的有効範囲,A の定義の前だけ
参考 随伴宣言が導入したクラス 又は 関数の宣言を検索する場合,囲んでいる最内側の名前空間有効範囲の
外側にある有効範囲は,対象としない( ) 。
参照)
参考 クラスの定義の中で挙用している名前に対する制約は,( で規定する。入れ子になったクラスの定
義の中で挙用している名前に対する制約は,*) で規定する。局所クラスの定義の中で挙用している名前
に対する制約は,* で規定する。
クラス
のメンバ関数( * )の定義の中で,関数の《宣言子識別子》の後に挙用している名前
は,次のい
ずれかを満たしていなければならない。
注 《 基底節》の中 又は クラス定義の中で生じる。
これは,その《クラス名》に続く修飾のない名前を指す。こうした名前の挙用は,
注
この検索は,
の定義が
の定義の中に入れ子になっている場合にも,
の定義が,の定義を囲む名前空間の中に現れている場合
( 参照)にも,適用する。
注 これは,例えば,次の中に現れる修飾なしの名前を指す。
――――― [JIS X 3014 pdf 25] ―――――
次のページ PDF 26
JIS X 3014:2003の引用国際規格 ISO 一覧
- ISO/IEC 14882:2003(IDT)
JIS X 3014:2003の国際規格 ICS 分類一覧
- 35 : 情報技術.事務機械 > 35.060 : 情報技術に使用される言語
JIS X 3014:2003の関連規格と引用規格一覧
- 規格番号
- 規格名称
- JISX0001:1994
- 情報処理用語―基本用語
- JISX0002:1987
- 情報処理用語(算術演算及び論理演算)
- JISX0003:1989
- 情報処理用語(装置技術)
- JISX0004:2002
- 情報処理用語(データの構成)
- JISX0005:2002
- 情報処理用語(データの表現)
- JISX0006:1989
- 情報処理用語(データの準備及び取扱い)
- JISX0007:2001
- 情報処理用語―プログラミング
- JISX0008:2001
- 情報処理用語―セキュリティ
- JISX0009:1997
- 情報処理用語(データ通信)
- JISX0010:1987
- 情報処理用語(操作技法及び機能)
- JISX0011:1989
- 情報処理用語(処理装置)
- JISX0012:1990
- 情報処理用語(データ媒体,記憶装置及び関連装置)
- JISX0013:1998
- 情報処理用語(図形処理)
- JISX0014:1999
- 情報処理用語―信頼性,保守性及び可用性
- JISX0015:2002
- 情報処理用語(プログラム言語)
- JISX0016:1997
- 情報処理用語(情報理論)
- JISX0017:1997
- 情報処理用語(データベース)
- JISX0018:1989
- 情報処理用語(分散データ処理)
- JISX0019:1994
- 情報処理用語―アナログ計算
- JISX0020:1992
- 情報処理用語(システム開発)
- JISX0021:1987
- 情報処理用語(プロセスインタフェース)
- JISX0022:1989
- 情報処理用語(計算器)
- JISX0023:1995
- 情報処理用語(テキスト処理)
- JISX0024:1998
- 情報処理用語(計算機統合生産)
- JISX0025:1994
- 情報処理用語―ローカルエリアネットワーク
- JISX0026:1995
- 情報処理用語(開放型システム間相互接続)
- JISX0027:1995
- 情報処理用語(オフィスオートメーション)
- JISX0028:1999
- 情報処理用語―人工知能―基本概念及びエキスパートシステム
- JISX0031:1999
- 情報処理用語―人工知能―機械学習
- JISX0032:1999
- 情報処理用語―電子メール