C++ 全局命名空间中的保留名称

C++ 全局命名空间中的保留名称,c++,token-name-resolution,C++,Token Name Resolution,根据我对以下问题的答复,并作为后续行动: 显然,全局名称空间中保留了以“”开头、后跟大写字母的名称 17.4.3.2.1全局名称[lib.Global.names] 某些名称和函数签名集始终保留给实现: 每个名称包含双下划线(\uu)或以下划线开头,后跟大写字母(2.11)的名称都保留给实现以供任何使用 每个以下划线开头的名称都保留给实现,以用作全局命名空间中的名称。165 165)此类名称也保留在名称空间::std(17.4.3.1)中 在我对第一个问题的回答中,我有一节课是这样的 cla

根据我对以下问题的答复,并作为后续行动: 显然,全局名称空间中保留了以“
”开头、后跟大写字母的名称

17.4.3.2.1全局名称[
lib.Global.names
] 某些名称和函数签名集始终保留给实现:

  • 每个名称包含双下划线(
    \uu
    )或以下划线开头,后跟大写字母(2.11)的名称都保留给实现以供任何使用
  • 每个以下划线开头的名称都保留给实现,以用作全局命名空间中的名称。165
165)此类名称也保留在名称空间
::std
(17.4.3.1)中

在我对第一个问题的回答中,我有一节课是这样的

class A
{
 private:
   vector<int> _Ints;
}
A类
{
私人:
向量积分;
}
在评论中,我被告知
\u Ints
标识符调用未定义的行为,因为它是一个保留名称。但是,根据最新的标准草案,成员变量的名称查找使用以下规则:

3.4.3.1班级成员[
Class.qual
] 如果限定id的嵌套名称指定人指定了一个类,则在该类(10.2)的范围内查找嵌套名称指定人之后指定的名称,以下列出的情况除外。名称应为 表示该类或其基类的一个或多个成员

对我来说,这意味着任何成员变量都不能成为全局命名空间的一部分,因为它的作用域是类

现在,问题是:
我的理解正确吗?成员变量永远不会违反实现保留名称规则,因为它们不在全局命名空间中?如果我说的不对,有人能解释一下我对查找规则的误解吗?

您引用的标准规则规定,以下划线开头,后跟大写字母的标识符是为任何用途保留的,而不仅仅是在全局命名空间中。因此,不允许命名成员变量
\u Ints

全局名称空间中保留以下划线开头的标识符,该标识符后面不跟下划线或大写字母。例如,您可以命名成员变量
\u ints
,但不能在全局名称空间中命名为
\u ints
的全局变量

显然,在全局命名空间中保留了(大写字母)

不可以。它在任何地方都是保留的。再次阅读17.4.3.2.1:

每个名称包含一个双下划线(u)或以下划线开头,后跟一个大写字母(2.11)的,都保留给实现以供任何使用


这根本没有提到“全局名称空间”(全局名称空间仅在后续规则中相关)。

\u Int
显然违反了第一条规则:“每个包含 双下划线(u_u)或以下划线开头,后跟 大写字母(2.11)保留给任何 “任何用途”的意思正是它所说的:它可以 是预定义的宏,或在编译器中触发某些特殊行为, 或者编译器作者想要的任何东西。你在哪里并不重要 使用名称,如果您使用它,它是未定义的行为(除非 编译器文档中另有说明)

更一般地说,至少在历史上,编译器是相当松散的, 许多系统标头传统上都包含带有 名称以单下划线开头,后跟小写字母。 最好还是避免这些。(从历史上看,甚至有 名字也没有下划线。我知道我有问题 名称
linux
变为
1
。看不到下划线,但。。。 但是,除了更改名称之外,您对此无能为力 当冲突发生时。)


更一般地说,下划线在某些字体中显示得不太好,
最好在符号的两端避免使用它们。

我习惯于表示“任何目的”,而不是任何范围。为什么该规则在“全局名称”部分下。@重新运行“任意目的”肯定包括在任何范围内声明变量。节名称令人困惑,但重要的是节的文本,这清楚地将保留标识符分为两种类型:保留用于任何用途的标识符和保留在全局名称空间中的标识符。“下划线在某些字体中显示得不太好”-1、l和I在某些字体中看起来相似,所以要避免标识符中的下划线?或者在阅读代码时避免使用这些字体?我同意Steve的观点,下划线是编程中的一个事实,如果你的字体不能呈现它们,那么你就有问题了。(我使用比例字体,但仍然没有问题)尽管如此,我在这方面相当极端——如果我可以避免,我不会在“字体”(或无论如何,文本编辑器设置)中阅读代码,因为“字体”不区分制表符和相等数量的空格。所以我对基本的文本可读性有很高的标准。@SteveJessop的符号不同只是因为一个使用小写字母l,另一个使用数字1不是一个好主意。至于下划线,它们将单词分开(它们类似于空格这一事实并不是什么大问题),但区分
\u name
name
name
并不比使用
x1
xl
xO
x0
好多少。