【发布时间】:2012-10-07 02:47:27
【问题描述】:
【问题讨论】:
-
为了完整起见,我将在此处链接旧问题stackoverflow.com/questions/228783/… 并提及规则没有改变。
-
哦,我没看到那个。尽管专门询问 C++11 是相关的,但我不确定现在应该采取什么适当的行动。是否应该关闭这个并编辑另一个的最佳答案?
【问题讨论】:
是的,当下划线后跟另一个下划线或大写字母时(即用于预处理器#defines 或宏),或者如果标识符位于全局命名空间中(第 17.6.4.3.2 节):
某些名称和函数签名始终保留给实现:
——每个包含双下划线 _ 或以下划线后跟大写字母 (2.12) 的名称都保留给实现以供任何使用。
— 每个以下划线开头的名称都保留给实现,用作全局命名空间中的名称。
注意,第一点的意思是如果两个下划线出现在标识符中的anywhere,即使在中间或末尾,该名称都是保留的。另外,我想补充一下(§17.6.4.3.5,强调我的):
不以下划线开头的文字后缀标识符保留用于将来的标准化。
【讨论】:
_name?
foo operator"" _bar(const char*); 可以,但foo operator"" bar(const char*); 是保留的
foo__bar 已被保留,而不仅仅是__foobar,而且我从很多其他人那里看到了同样的事情。
它们不像for 那样保留,但您不应该使用它们,因为编译器开发人员可能会使用它们来命名自己的函数,因此可能会与您的函数冲突。所以如果你使用my_class::_function那么应该没有错误,但是写一个像void _function()这样的全局函数可能会用一个编译器产生一个重复!
【讨论】:
foo__bar 或 _FooBar 的成员函数仍然可以与它们发生冲突。