我在程序中犯了错误,我写了
struct vector<int> v;
而不是
vector<int> v;
但似乎编译器并不关心:http://codepad.org/TCPb8p2u
为什么会这样?是否有struct
的差异?
答案 0 :(得分:6)
如果你写class
,它也会有效。
class vector<int> v;
请参阅:http://www.ideone.com/EoJxk
这实际上是旧C风格。 C ++标准在第3.4.4节中将其称为 elaborated-type-specifier 。
关键字struct
(或class
,enum
)有时用于删除歧义,或使隐藏名称可见到编译器。请考虑标准本身的以下示例(来自第9.1 / 2节)。请注意,struct
存在名称为stat
且完全相同的函数:
struct stat {
// ...
};
stat gstat; // use plain stat to define variable
int stat(struct stat*); // redeclare stat as function
void f()
{
struct stat* ps; // struct prefix needed to name struct stat
// ...
stat(ps); //call stat()
// ...
}
§9.1/ 2说,
类定义介绍了 类名称放在它所在的范围内 定义并隐藏任何类,对象, 功能或其他声明 封闭范围内的名称(3.3)。如果一个 类名在范围内声明 对象,功能或者 同名的调查员也是 声明,然后两个声明 在范围内,班级可以 仅提到使用 elaborated-type-specifier(3.4.4)。
答案 1 :(得分:2)
这是C ++的一个功能,用于解决变量和具有相同名称的类型之间的歧义。我相信它们被称为“精心设计的类型说明符。”
当通常存在歧义时,您可以使用关键字告诉编译器您的意思。
以此为例:
int x = 0;
class x { };
// Compiler error! Am I refering to the variable or class x?
x y;
// This is okay, I'm telling the compiler which x I'm referring to.
class x y;
这也可用于指定枚举和联合,而不仅仅是结构和类,尽管您只能有一个具有相同名称的用户定义类型。
答案 2 :(得分:2)
其他人已经解释过你使用的是详细类型说明符,它可以用于名称取消隐藏和模糊解析。
然而,这里也有用的是C ++语言的一个奇怪的特性,它声明在类声明中使用的 class-key (即class
或struct
关键字)是不需要同意详细说明的类型说明符中使用的 class-key 。例如。您可以使用class
关键字声明自己的课程,然后使用struct
关键字引用它(反之亦然)。它没有错误
class S {};
int main() {
struct S s; // OK, 's' has type `S` (i.e. `class S`)
}
标准std::vector
模板类是使用关键字class
声明的,但在将其称为struct std::vector
时没有错误,这就是您在示例中所做的。
不,在您使用v
,class
的声明中,或者在使用struct
或根本没有声明时,这一点没有区别。