根据C ++标识符命名规则:
有效标识符是一个或多个字母,数字或下划线字符(_)的序列,必须以字母或下划线开头。空格,标点符号和符号不能是标识符的一部分。
但是,运算符重载的函数名称可以包含字母,数字或下划线以外的字符,例如:
user_data_type operator+(const user_data_type & t) const;
这是标识符命名规则的例外,还是用于运算符重载的函数名称不被视为标识符?
答案 0 :(得分:8)
operator
不是普通标识符,它是N4140中13.5 / 1中定义的 operator-function-id 。根据定义,它由单词+
后跟运算符组成,在您的示例中为operator +
。通过这条规则,你也可以写
user_data_type
operator
+
(const user_data_type & t) const;
甚至
operator+
同样,{{1}}不是普通标识符。
您引用的规则不适用于此处。
答案 1 :(得分:7)
来自§3.1
名称是使用标识符(2.11), operator-function-id (13.5),literal-operator-id(13.5.8),转换-功能- id(12.3.2),或表示实体或标签的模板ID(14.2)(6.6.4,6.1)。
因此,正如您所看到的,标识符(它们是变量/函数名称)有规则。但是有一些例外,运算符重载( operator-function-id )就是其中之一,这意味着不同的规则适用于它们。
来自§13.5:
operator-function-id: operator operator
运营商:
之一
new delete new [] delete []
+ - * /%& | 〜
! =< > + = - = * = / =%=
=& = | =<< >> >> =<< = ==!=
< => =&& || ++ - , - > * - >
()[]
因此,允许operator+
,operator-
,基本上operator
+ any of the operators listed above
。
答案 2 :(得分:1)
有五种类型的标记:关键字,标识符,常量, 运算符和分隔符
因此运营商不是标识符。
user_data_type operator + (const user_data_type & t) const;/*
^^^^^ ^^^^^ ^
identifier keyword operator
*/
答案 3 :(得分:1)
运算符重载函数只能包含可以重载的运算符的标点符号或符号。使用关键字operator
后跟有效运算符时,您使用的是C的内置功能,而不是创建自己的标识符。