その理由は、Stroustrup からの引用で述べたように、歴史的なものです。C では、常に構造体の名前の前に;を付ける必要があります。struct
構造体の名前 (共用体や列挙型の名前など) はタグと呼ばれ、他のシンボルとはまったく異なる名前空間に存在します。次のようなもの:
struct stat
{
// ...
};
int stat( char const* filename, struct stat* buf );
完全に合法です。(実際、上記は Posix の一部です)。
C++ では、( class
、struct
または
で宣言されたunion
) クラスの名前または列挙型は他のすべてのものと同じ名前空間にあり、C とは異なり、次のように記述できます。
struct MyClass {};
MyClass variableName;
これは正当な C ではありません。C では、2 行目は次のようにする必要があります。
struct MyClass variableName;
問題は、C++ が C で定義されたインターフェース (上記の Posix インターフェースなど) を使用できる必要があることです。そのため、C++ ではそれを可能にする特別な規則がいくつか定義されています。変数または関数とクラス型に同じ名前を付けることができます。これを行うと、変数または関数名が優先され、クラス名が非表示になります。ただし、「詳細な型指定子」(つまりclass
、
struct
、union
またはenum
の後に記号が続く) を除きます。この場合、型以外の名前はルックアップで無視されます。