根据C++标识符命名规则:
有效的标识符是一个或多个字母、数字或下划线字符(_)的序列,并且必须以字母或下划线开头。空格、标点符号和符号不能是标识符的一部分。
但是运算符重载函数的名称可以包含字母、数字或下划线以外的字符,例如:
user_data_type operator+(const user_data_type & t) const;
这是标识符命名规则的例外,还是用于运算符重载的函数名不被视为标识符?
operator+
不是正常标识符,它是N4140中13.5/1中定义的运算符函数id。根据定义,它由单词operator
和一个运算符组成,在您的示例中就是+
。根据这个规则,你也可以写
operator +
甚至
user_data_type
operator
+
(const user_data_type & t) const;
同样地operator+
不是正常标识符。
你引用的规则在此不适用。
来自§3.1
名称是对标识符(2.11)、运算符函数id的使用(13.5)、文字运算符id(13.5.8)、转换函数-id(12.3.2),或表示实体或标签的模板id(14.2)(6.6.4,6.1)。
因此,正如您所看到的,标识符(变量/函数名)有一些规则。但也有一些例外,运算符重载(运算符函数id)就是其中之一,这意味着不同的规则适用于它们。
来自§13.5:
操作员函数id:操作员操作员
操作符:之一
new delete new[]delete[]
+-*/%
!=<gt;+=-=*=/=%=
2.6.1=&=|=<lt>gt>gt;=<lt;===!=
<=>=&;||++--->*->
()[]
所以,允许operator+
,也允许operator-
,基本上是operator
+any of the operators listed above
。
运算符重载函数只能包含可以重载的运算符标点符号。当使用关键字operator
后跟有效运算符时,您使用的是C的内置功能,而不是创建自己的标识符。
GNU C参考手册指出
令牌有五种类型:关键字、标识符、常量、,操作员和分离器
因此操作员不是标识符。
user_data_type operator + (const user_data_type & t) const;/*
^^^^^ ^^^^^ ^
identifier keyword operator
*/