什么是’标识符’是C ++中的’名字’?

何时在C ++中称为“名称”的“标识符”? 我主要读到“名称”一词过于使用而不是“标识符”,例如:

struct S { int i }; S thing1; 

在这种情况下, thing1名称还是标识符 ? 或者术语“标识符”和“名称”是类似的吗? 在C中,在引用对象时是否使用术语“名称”?

在C ++中,术语标识符只是一个数字,字母和_的序列,而不是以数字开头。 这样的标识符可以出现在任何地方,并且不必标识任何内容,尽管它的名称(没有双关语)。

术语名称将含义与某个语法结构相关联。 C ++规范说如果下面的一个语法结构表示一个实体(一个对象 ,一个 ,一个模板等)或一个标签(你可以用goto跳转到),它就是一个名字。

  • 识别码
  • template-ididentifier <...>operator-function-id <...>literal-operator-id <...> ,如foo )。
  • conversion-function-idoperator type ,如operator int
  • operator-function-idoperator @ ,如operator +
  • literal-operator-idoperator "" identifier ,如operator "" _foo

对于这些构造中的每一个,当名称与另一个名称相同时,规则的定义不同:对于标识符,两个名称相同的序列是相同的(这只是一个词法比较)。 对于表单conversion-function-id的名称,如果使用的类型是相同类型,则它们是相同的(因此这是语义比较)。

正如您在literal-operator-id的示例中所看到的,非终端标识符可以出现在语法中不是名称的地方。 因此,并非每个标识符都是名称,并非每个名称都是标识符 。 在template-id的示例中,我们使用名称的嵌套使用。 <...>之前的构造分别是名称,因为它们表示声明的模板。