このコードがあります:
int x;
//void x(); // error: redefinition of 'x' as different kind of symbol
class x {}; // works ok
int main() {
return 0;
}
変数とクラスを同じ名前で定義することは合法ですが、変数と関数を同じ名前で定義することは合法ではないのはなぜですか?
このコードがあります:
int x;
//void x(); // error: redefinition of 'x' as different kind of symbol
class x {}; // works ok
int main() {
return 0;
}
変数とクラスを同じ名前で定義することは合法ですが、変数と関数を同じ名前で定義することは合法ではないのはなぜですか?
最初のケース: 2 つの識別子
int x;
void x();
2 番目のケース: 1 つの識別子、1 つの型名
int x;
class x {};
同じ名前の識別子が 2 つあるため、コンパイラは最初のケースを処理できず、あいまいさが生じる可能性があります。(例: そのうちの 1 つのメモリ アドレスを取得してみてください。これは、あいまいさが生じる可能性がある 1 つのケースです)
一方が型で、もう一方が識別子であるため、コンパイラは 2 番目のケースを処理できます。また、型と識別子が必要な場所がわかっているため、あいまいさがなくなります。
ここで起こっていることは、C++ に固有のものです。x
クラス名としての の使用は隠されています。
セクション 3.3.7 (名前の非表示) パラグラフ 2:
クラス名 (9.1) または列挙名 (7.2) は、同じスコープで宣言されたオブジェクト、関数、または列挙子の名前によって非表示にすることができます。クラスまたは列挙名と、オブジェクト、関数、または列挙子が同じスコープで (任意の順序で) 同じ名前で宣言されている場合、クラスまたは列挙名は、オブジェクト、関数、または列挙子の名前が表示されている場所では非表示になります。