在 C ++ 中,是否可以使用数字启动类名?例如,
template <class T> class 2DArray {
public:
// 1D ARRAY CLASS
class 1DArray {
public:
1DArray() { Create(); }
1DArray(iterator arr) : array1d_(arr) { }
explicit 1DArray(size_type cols, const T& t = T()) { Create(cols, t); }
1DArray(const 1DArray& arr) { Create(arr.begin(), arr.end()); }
1DArray& operator=(const 2DArray&);
~1DArray() { Uncreate(); }
T& operator[](size_type n) {
return array1d_[n];
}
const T& operator[](size_type n) const {
return array1d_[n];
}
}
答案 0 :(得分:25)
C ++ 中的标识符名称规则为:
C++ draft standard中涵盖此内容的部分是2.11
标识符,其中包含以下语法:
identifier:
identifier-nondigit <- Can only start with a non-digit
identifier identifier-nondigit <- Next two rules allows for subsequent
identifier digit <- characters to be those outlined in 2 above
identifier-nondigit:
nondigit <- a-z, A-Z and _
universal-character-name
other implementation-defined characters
[...]
和2.12
关键字解释了保留用作关键字的所有标识符。
最后,还保留以下名称:
__
的名称,或以任何范围内的下划线后跟大写字母(如_Apple
)开头,_apple
)。 草案标准中涵盖此内容的部分为17.6.4.3.2
。我们可以从Rationale for International Standard—Programming Languages—C中找到保留这些内容的理由:
[...]这给了一个名称空间,用于编写众多幕后非外部宏和库需要正常工作的函数[...]
在 C ++ 中,这也适用于此name mangling显示的example。
脚注
允许的通用字符包含在Annex E.1
:
E.1允许的字符范围[charname.allowed]
<00> 00A8,00AA,00AD,00AF,00B2-00B5,00B7-00BA,00BC-00BE,00C0-00D6,00D8-00F6,00F8-00FF
0100-167F,1681-180D,180F-1FFF 200B-200D,202A-202E,203F-2040,2054,
2060-206F 2070-218F,2460-24FF,2776-2793,2C00-2DFF,2E80-2FFF
3004-3007,3021-302F,3031-303F
3040-D7FF F900-FD3D,FD40-FDCF,
FDF0-FE44,FE47-FFFD
10000-1FFFD,20000-2FFFD,30000-3FFFD, 40000-4FFFD,50000-5FFFD,60000-6FFFD,70000-7FFFD,80000-8FFFD, 90000-9FFFD,A0000-AFFFD,B0000-BFFFD,C0000-CFFFD,D0000-DFFFD, E0000-EFFFD
答案 1 :(得分:4)
简单的答案是否定的。为什么你不称之为OneDArray?
答案 2 :(得分:4)
令人惊讶的是,我无法找到此问题的重复版本或更一般版本,这里是基于标准(C ++ 11)所说的答案。
首先,根据§9/ 1,类名是标识符(或者在模板专业化的情况下是 simple-template-id ,但是 simple-template-id 也由标识符组成。
§2.11定义了有效的标识符是什么。它首先介绍了一些基本概念:
数字就是其中之一:0 1 2 3 4 5 6 7 8 9
nondigit 就是其中之一:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
通用字符名称是\unnnn
或\Unnnnnnnn
类型的序列(其中每个n
是十六进制数字)
标准然后将 identifier-nondigit 定义为
最后,标识符以递归方式定义为
标识符:
标识符非数字
标识符 标识符非数字
标识符 位
摘要:换句话说,标识符必须以(非数字!)字母字符开头,后面可以跟任何由字母数字字符,下划线和\unnnn
组成的字符,如字符引用。其他任何东西都是特定于实现的。
(‡)是否支持任何内容取决于您的编译器,使用它们通常意味着您将失去对其他编译器或编译器版本的可移植性。
答案 3 :(得分:1)
C ++中的名称必须以'letter'开头,其中letter是大写和小写'A-Z,a-z'。 '_'也算作'字母'。然后可以跟随字母和数字的任何组合。