为什么 libstdc++ 标头包含制表符和空格的混合?

led*_*ter 6 c++ gcc indentation libstdc++

我已经研究 libstdc++ 标头几年了,我总是对它混合制表符和空格的奇怪程度感到惊讶,例如:

      template<typename _Up, typename... _Args>
<tab   >constexpr
<tab   >_Optional_payload_base(std::initializer_list<_Up> __il,
<tab   ><tab   ><tab   >       _Args&&... __args)
<tab   >: _M_payload(__il, std::forward<_Args>(__args)...),
<tab   >  _M_engaged(true)
<tab   >{ }

<...>

<tab   >  _Empty_byte _M_empty;
          _Up _M_value;
<tab   >};

      template<typename _Up>
<tab   >union _Storage<_Up, false>
<tab   >{
Run Code Online (Sandbox Code Playgroud)

为什么即使在同一行中也会随机混合制表符和空格?

当使用非 8 个选项卡显示设置查看时,它会变得更加混乱(我猜很多用户可能都有......)。

libc++ 标头 OTOH 看起来很好(没有选项卡 AFAIR)...

显然,如果它只是关于制表符与空格,那么这将是一个基于意见的问题,但这是两者的混合......我认为这从来都不是一个好主意,并且除了 libstdc++ 之外没有在任何地方看到它,我认为......

S.M*_*.M. 7

这是常见的老式智能制表符缩进,用于节省磁盘空间并提高 USB 之前设备之间的传输速度。此外,与在 4 个或 8 个空格上移动相比,矩阵针式打印机在单个选项卡符号上移动的滑架速度更快。

\n
    \n
  1. 制表符仅用在行的开头。其他所有内容(例如 ASCII 艺术和表格)都应使用空格进行格式化。
  2. \n
  3. 制表符仅用于表达缩进级别。每个 \xe2\x80\x9cblock\xe2\x80\x9d \xe2\x80\x93 一个制表符,任何剩余的空白仅是空格。
  4. \n
\n
\n

列表项是从范妮文章SmartTabsIndent with tabs,align with space 中获得的引用。

\n