2016-05-15 61 views
3

根据该C++标识符命名规则:标识符规则是否适用于运算符重载函数?

的有效标识符是一个或多个字母,数字的序列,或下划线字符(_),必须重新开始或者以字母或下划线。空格,标点符号和符号不能是标识符的一部分。

但对于运算符重载函数可以包含除字母,数字等字符或下划线,例如像的名字:

user_data_type operator+(const user_data_type & t) const; 

这是一个例外标识符命名规则或不用于运算符重载的函数名称不被视为标识符?

回答

7

从§3.1

的名称是使用标识符(2.11),操作者功能-ID(13.5)的,文字的操作员-ID(13.5.8),转换功能 id(12.3.2)或表示实体或标签(6.6.4,6.1)的模板id(14.2)。

因此,正如你所看到的,标识符(它们是变量/函数名称)有规则。但也有一些例外情况,运算符超载( operator-function-id)就是其中之一,这意味着不同的规则适用于它们。

从§13。5:

操作员功能-ID:操作者操作者操作者

:一个

  • 新删除新[]删除[]

  • + - * /%& | 〜

  • ! = <> + == * =/=%=

  • = & = | = < < >> = < < = = = =

  • < => = & &!| | ++ - , - > * - >

  • ()[]

所以,operator+是允许的,也operator-,基本上operator + any of the operators listed above

+0

所以基本上'operator-function-id'序列不是(技术上)一个标识符,对吧? – stackerjoe

+0

@stackerjoe正确,它不能同时:) – Rakete1111

+0

谢谢。现在清楚了。 – stackerjoe

8

operator+不是一个正常的标识符,它是一个运营商功能ID在N4140 13.5/1中定义。根据定义,它由operator后跟一个运算符组成。通过这条规则,你也可以作为再次写入

operator + 

甚至

user_data_type 
operator 


+ 
(const user_data_type & t) const; 

operator+是不是一个正常的标识符。

您引用的规则不适用于此处。

1

The GNU C reference manual指出

有五种类型的令牌:关键字,标识符,常数, 运营商,和隔板

因而操作者不是标识符。

user_data_type operator + (const user_data_type & t) const;/* 
^^^^^   ^^^^^ ^
identifier  keyword operator 
*/ 
+0

请注意,适用于C的内容可能不适用于C++。所以这并不完全回答这个问题。 – Hiura

+0

@Hiura你是对的。例如C++也有一个有效的符号'〜'。但就这个问题而言,我的答案似乎是有效的,尽管它用另一种语言描述了一种语言的功能。 – teivaz

1

运算符重载函数只能包含标点符号或符号,它们是可以重载的运算符。当使用关键字operator后跟一个有效的操作符时,您正在使用C的内置功能,而不是创建自己的标识符。