回顾C ++编译时间计数器
TL; DR 在尝试阅读整篇文章之前,请了解: 我自己已经找到解决所提出问题的方法,但是我仍然很想知道分析是否正确; 我已经将解决方案打包到一个fameta::counter类中,该类可以解决一些剩余的怪癖。您可以在github上找到它; 您可以在使用Godbolt上看到它。 一切如何开始 自从FilipRoséen在2015年发现/发明以来,编译计时器的黑魔法就用C ++了,我一直对这个设备有些痴迷,所以当CWG 决定必须取消功能时,我很失望,但仍然希望他们的想法通过向他们展示一些引人注目的用例可以对其进行更改。 然后,几年前,我决定再次研究一下问题,以便将uberswitch es嵌套(在我看来,这是一个有趣的用例),只是发现它不再适用于新版本的。可用的编译器,即使问题2118处于(并且仍然)处于打开状态:代码可以编译,但计数器不会增加。 在Roséen的网站上已经报告了该问题,最近在stackoverflow上也报告了该问题:C ++是否支持编译时计数器? 几天前,我决定再次尝试解决问题 我想了解编译器中发生了什么变化,这些变化使看似仍然有效的C ++不再起作用。为此,我在互联网上进行了广泛的搜索,寻找有人对此进行讨论,但无济于事。因此,我开始进行实验并得出一些结论,我在这里提出的想法是希望从这里得到比我自己更了解的反馈。 为了清楚起见,下面我将介绍Roséen的原始代码。有关其工作原理的说明,请访问他的网站: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; …