簡體   English   中英

用戶定義的文字,下划線和全局名稱

[英]User-defined literals, underscores, and global names

在C ++ 11中,我們獲得了用戶定義的文字。 C ++標准提供了這些示例,例如:

long double operator "" _w(long double);

它說文字應以下划線開頭:

17.6.4.3.5用戶定義的文字后綴
不以下划線開頭的文字后綴標識符保留用於將來的標准化。

但是,該標准的另一部分說

17.6.4.3.2全局名稱
某些名稱和函數簽名集始終保留給實現:
—每個包含雙下划線_ _或以下划線后跟大寫字母(2.12)開頭的名稱都保留給實現以供任何使用。
—每個以下划線開頭的名稱都保留給實現,以用作全局名稱空間中的名稱。

我希望更好地理解17.6.4.3.2(全局名稱)說/表示的內容及其與17.6.4.3.5(用戶定義的文字后綴)的關系。 特別:

  • 17.6.4.3.2(全局名稱)的第二部分是否需要在名稱空間(即不在全局名稱空間中)中定義用戶定義的文字(如上述_w )? 如果是這樣,我希望標准能夠說明這一點。
  • 我假設17.6.4.3.2(全局名稱)的第一部分排除了用戶定義的文字,例如_W (大寫字母之后)以及__w_w__ (兩個連續的下划線)。 正確?

編輯:

作為后續,該標准的一部分內容如下:

13.5.8用戶定義的文字
[...]
2 聲明者ID為文字操作者ID的聲明應為名稱空間范圍函數或函數模板的聲明(它可以是好友函數(11.3)) ,函數模板的顯式實例化或特殊化,或者使用聲明(7.3.3)。 用literal-operator-id聲明的函數是文字運算符。 用literal-operator-id聲明的功能模板是文字操作符模板。

強調我的。 當它說“ namespace-scope”時,是否意味着需要在用戶定義的名稱空間(即不在全局名稱空間中)聲明用戶定義的文字?

以后編輯:

首次提出問題時不存在該問題,但現在也存在與此相關的問題和答案,讀者可以在閱讀以下答案后進行進一步檢查。

名字叫什么? 3個基本概念[基本]告訴我們:

4名稱是對標識符(2.11),操作員功能ID(13.5),文字操作員ID(13.5.8),轉換功能ID(12.3.2)或模板ID(14.2)的使用)表示實體或標簽(6.6.4,6.1)。

我們將其與13.5.8用戶定義的文字[over.literal]進行交叉引用:

literal-operator-id
operator ""標識符

盡管文字運算符的名稱涉及一個標識符,但該標識符並不表示實體。 (或者是一個不同的標識符和不同的名稱,表示另一個實體或標簽。)因此,文字運算符的名稱絕不能以下划線開頭。

喜歡的東西, operator""__w 有問題的,但是這並不新鮮: int i__0; 也被保留。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM