标识符规则是否适用于运算符重载功能?

时间:2016-05-15 15:47:40

标签: c++

根据C ++标识符命名规则:

  

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

但是,运算符重载的函数名称可以包含字母,数字或下划线以外的字符,例如:

user_data_type operator+(const user_data_type & t) const;

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

4 个答案:

答案 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)

The GNU C reference manual表示

  

有五种类型的标记:关键字,标识符,常量,   运算符和分隔符

因此运营商不是标识符。

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

答案 3 :(得分:1)

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