このコードは MSVC9.0 で受け入れられます。私の質問は、標準(古いものおよび/または新しいもの)に従って合法であるかどうかです。お見積りも大歓迎です。
class X
{
void X::f();
};
このコードは MSVC9.0 で受け入れられます。私の質問は、標準(古いものおよび/または新しいもの)に従って合法であるかどうかです。お見積りも大歓迎です。
class X
{
void X::f();
};
いいえ、これは無効です。ここでX::f
は修飾名です。これをdeclarator-idとして使用しようとしています。C++03 8.3[dcl.meaning]/1 には、declarator-idが修飾される状況がリストされています。
宣言子 IDは、以下を除いて修飾されてはなりません。
クラス外のメンバー関数または静的データメンバーの定義、
その名前空間の外部にある名前空間の関数または変数メンバーの定義または明示的なインスタンス化、または
その名前空間の外で以前に宣言された明示的な特殊化の定義、または
別のクラスまたは名前空間のメンバーであるフレンド関数の宣言。
X::f
これらの 4 つのカテゴリのいずれにも当てはまらないため、正しくありません。
クラス定義外のメンバー関数の定義を修飾する必要がある規則は、C++03 9.3[class.mfct]/5 にあります。
メンバー関数の定義が字句的にそのクラス定義の外にある場合、メンバー関数名は、
::
演算子を使用してそのクラス名で修飾されます。
私が理解しているように、C++03仕様では無効です。
参照 - C++03 標準:
セクション $8.3:
各宣言子には、declarator-id が 1 つだけ含まれています。宣言されている識別子に名前を付けます。declarator-id の id-expression は、いくつかの特殊関数 (12.3、12.4、13.5) の宣言と、テンプレートの特殊化または部分的な特殊化 (14.7) の宣言を除いて、単純な識別子でなければなりません。宣言子 ID は、クラス外のメンバー関数 (9.3) または静的データ メンバー (9.4) またはネストされたクラス (9.7)の定義、関数、変数、またはクラス メンバーの定義または明示的なインスタンス化を除いて修飾されません。その名前空間の外側の名前空間の、またはその名前空間の外側で以前に宣言された明示的な特殊化の定義、または別のクラスまたは名前空間 (11.4) のメンバーであるフレンド関数の宣言。
上記の適切な意味を導き出していることを願っています。標準からの引用を読んで理解すると、少しめまいがすることを認めます。解釈が間違っていたら教えてください。