【发布时间】:2012-03-28 23:07:18
【问题描述】:
源于我对Dynamic array of objects in C++ 的回答以及对What are the rules about using an underscore in a C++ identifier? 的跟进:
显然,以_ 后跟一个大写字母开头的名称被保留在全局命名空间中。
17.4.3.2.1 全局名称 [
lib.global.names]某些名称和函数签名始终保留给实现:
- 每个包含双下划线 (
__) 或以下划线后跟大写字母 (2.11) 的名称都保留给实现以供任何使用。- 以下划线开头的每个名称都保留给实现,用作全局命名空间中的名称。165
165) 此类名称也保留在命名空间
::std(17.4.3.1) 中。
在我对第一个问题的回答中,我有一个看起来像这样的课程
class A
{
private:
vector<int> _Ints;
}
在 cmets 中,有人告诉我 _Ints 标识符会调用未定义的行为,因为它是一个保留名称。但是,根据最近的标准草案,成员变量的名称查找使用以下规则:
3.4.3.1 类成员 [
class.qual]如果 qualiified-id 的 nested-name-speciifier 指定了一个类,则查找在 nested-namespeciifier 之后指定的名称在类 (10.2) 的范围内,除了下面列出的情况。该名称应 表示该类或其基类之一的一个或多个成员
对我来说,这意味着任何成员变量都不能成为全局命名空间的一部分,因为它的作用域就是类。
现在,问题来了:
我的理解是正确的吗,成员变量永远不会违反实现保留名称规则,因为它们不在全局命名空间中?如果我不正确,有人可以解释我对查找规则的误解吗?
【问题讨论】: