2016-05-15 63 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的內置功能,而不是創建自己的標識符。