今天看STL源码的时候注意到一个有意思的地方,获取定长数组的长度 std::size
函数的简单实现如下:
1 | template <class _Ty, size_t _Size> |
如果阅读这个代码有些困难,它的一个特化实现可以简单写成下面这样:
1 | template <size_t _Size> |
虽然平时也算是阅码无数,看到这个函数还是愣了几秒钟,这个函数的参数 const int (&)[_Size]
里的 (&)
是什么鬼?
今天看STL源码的时候注意到一个有意思的地方,获取定长数组的长度 std::size
函数的简单实现如下:
1 | template <class _Ty, size_t _Size> |
如果阅读这个代码有些困难,它的一个特化实现可以简单写成下面这样:
1 | template <size_t _Size> |
虽然平时也算是阅码无数,看到这个函数还是愣了几秒钟,这个函数的参数 const int (&)[_Size]
里的 (&)
是什么鬼?
话不多说,先上code!
1 | // 最简单的方式创建一个json对象 |
有没有觉得单看这段代码都有种js内味了(误)。但是没错,上面这段代码是C++
!
如果这引起了你的些许兴趣,那就说明这个轮子成功了。
9月11日更新
最近发布的Go 1.14.9
版本已经修复了该BUG,详情右转👉Release History。
在Go 1.13和1.14版本现存一个很玄学的BUG,在for循环中的一个常数会导致无法退出循环,一个简单的示例:
1 | package main |
很简单的一段代码,预期输出如下
1 | 0 |
但实际运行发现程序进入死循环,i无限增长,继续测试发现,把 i+1
改成 i+2
,运行就正常了!
这就很玄学了,循环体内的一个常数导致for-range越界了😳