C++ 结构向量工程

C++ 结构向量工程,c++,struct,C++,Struct,我在程序中犯了一个错误,我写道 struct vector<int> v; 结构向量v; 而不是 vector<int> v; 向量v; 但编译器似乎并不关心: 它为什么有效?有或没有struct是否存在一些差异?如果您编写类,它也会起作用 class vector<int> v; §9.1/2规定 类定义引入了 将类名放入其所在的范围 已定义且隐藏任何类、对象、, 函数,或该函数的其他声明 封闭范围内的名称(3.3)。如果 类名在作用域中声明 其中

我在程序中犯了一个错误,我写道

struct vector<int> v;
结构向量v; 而不是

vector<int> v;
向量v; 但编译器似乎并不关心:


它为什么有效?有或没有
struct
是否存在一些差异?

如果您编写
,它也会起作用

class vector<int> v;
§9.1/2规定

类定义引入了 将类名放入其所在的范围 已定义且隐藏任何类、对象、, 函数,或该函数的其他声明 封闭范围内的名称(3.3)。如果 类名在作用域中声明 其中一个对象、函数或 也可以使用相同名称的枚举数 声明,然后当两个声明 如果在范围内,则该类可以 仅指使用 详细的类型说明符(3.4.4)


这是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;

这也可以用于指定枚举和联合,而不仅仅是结构和类,尽管您只能有一个具有相同名称的用户定义类型。

其他人已经解释过,您所使用的被称为详细类型说明符,可用于名称取消隐藏和歧义解决

但是,这里也有一个奇怪的C++语言特性,它指出在类声明中使用的类键(即代码>类<代码>或<代码>结构> <代码>关键字不需要与详细类型说明符中使用的类键相一致。例如,您可以使用

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<代码>中,你没有使用<代码>类<代码> >代码>结构>代码>或者什么都没有。

我想问题是:“如果这是有效的,它是否做了我想表达的?”谢谢,这对我来说是新的:在C++中,你可以用相同的名字声明变量和类!你也不应该这样做。曾经。:)
class S {};

int main() {
  struct S s; // OK, 's' has type `S` (i.e. `class S`)
}