Fork me on GitHub

C++之那些年踩过的坑(五)

很久没有更新了。因为最近还在重构 MyTinySTL,过程还是挺艰辛的 =.= 重构了一遍 rb_tree,整整看了几天代码,各种博客和 paper 才开始下得了手。结果好不容易把 rb_tree 给重构完,又发现了 deque 出了内存管理的问题…又重构了一遍。

看到以前写的代码,想推翻重来是很正常的。要么就是以前写得实在是太好了,不需要重构,代码清清楚楚,性能完全压榨。要么就是以前水平太低,现在看不下去。但前者的情况还是比较少的嘛。本来我写这个 MyTinySTL,只是拿来玩玩的,结果被喷不少,结果就是现在越来越接近标准库。。

当然前面讲的这些都不是重点,而是我一直有一个错误的做法,而且还一直没发现。就是看我以前写的东西,会有很多函数,前面有两个下划线 __,比如私有成员函数、辅助函数等,比如以下一张选自曾经的 deque

1c83b889bd53e9acs.png

然后偶然间,被某大神看到,喷了一顿。因为这不是合法的行为,见 n4659 5.10.3 节:

3 In addition, some identifiers are reserved for use by C++ implementations and shall not be used otherwise; no diagnostic is required.
(3.1) – Each identifier that contains a double underscore __ or begins with an underscore followed by an uppercase letter is reserved to the implementation for any use.
(3.2) – Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

以下这两种情况:

  • 所有包含了双下划线 __ 的,或者 以单下划线 _ 加一个大写字母为开头的标识符
  • 全局名称空间下,以单下划线开头的标识符

都是保留给编译器实现的。反正我们这些凡人,要是不是在写编译器,那老老实实别用,否则后果自负。
其实我也是受了某本书的影响,所以才这么用的。现在慢慢长大了,就一点一点要把以前的东西改过来。要是有机会,再慢慢记录一下这个过程吧!
还要继续写 bug,早日挖出一个巨坑。

-------------------------------- 全文完 感谢您的阅读 --------------------------------
「写的那么辛苦,连一块钱都不打赏吗/(ㄒoㄒ)/~~」