rer*_*run 5 c++ token-name-resolution
由我对C++中动态对象数组的回答以及后续有关在C++标识符中使用下划线的规则有哪些?:显然,_在全局命名空间中保留以大写字母开头的名称.
17.4.3.2.1全局名称[
lib.global.names]某些名称和函数签名集始终保留给实现:
- 每个包含双下划线(
__)或以下划线后跟大写字母(2.11)开头的名称都保留给实现以供任何使用.- 以下划线开头的每个名称都保留给实现,以用作全局名称空间中的名称.165
165)这些名称也在名称空间中保留
::std(17.4.3.1).
在我对第一个问题的回答中,我有一个看起来像这样的课程
class A
{
private:
vector<int> _Ints;
}
Run Code Online (Sandbox Code Playgroud)
在评论中,我被告知_Ints标识符调用未定义的行为,因为它是一个保留名称.但是,根据最近的标准草案,使用以下规则进行成员变量的名称查找:
3.4.3.1班级成员[
class.qual]如果嵌套namespeci网络ER A的合格音响ED-ID提名的一类,后指定的名称嵌套namespeci网络ER在类(10.2)的范围抬头,除下列情况下.该名称应代表该类或其基类之一的一个或多个成员
对我来说,这意味着没有成员变量可以成为全局命名空间的一部分,因为它的范围是类.
我的理解是否正确,成员变量永远不会违反实现保留名称规则,因为它们不在全局命名空间中?如果我不正确,有人可以解释我对查询规则的误解吗?
_Int显然违反了第一条规则:"每个包含双下划线(_ _)的名称或以下划线后跟大写字母(2.11)的名称保留给实现用于任何用途.""任何使用"都意味着它所说的:它可能是预定义的宏,或触发编译器中的某些特殊行为,或编译器作者想要的任何其他内容.使用名称无关紧要,如果使用它,则是未定义的行为(除非编译器文档另有说明).
更一般地说,至少在历史上,编译器相当松散,并且许多系统头文件传统上包括名称以单个下划线开头,后跟小写字母的宏.它也可能是最好的避免这些.(历史上,甚至,已经有名字没有下划线为好.我知道,我已经受够了名字的问题linux变得1没有凸显在眼前,但是...,没有太多可以做这一点,但是除了改变冲突发生时的名称.)
更一般地说,下划线在某些字体中并没有表现得那么好,并且最好在符号的任何一端避开它们.
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |