标识符规则是否适用于运算符重载函数



根据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;===!=

  • <=>=&amp;||++--->*->

  • ()[]

所以,允许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
*/

最新更新