[英]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(用戶定義的文字后綴)的關系。 特別:
_w
)? 如果是這樣,我希望標准能夠說明這一點。 _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.