依据C++11编译器和C++17标准模板库标准,VS2015RTM版本实现了该标准中的常量表达式特性

[原文发表地址] constexpr Complete For VS 2015 RTM: C++11 compiler, C++17 STL

[原文发表时间] 2015/06/02 12:43AM

我们已经在VS2015 RTM版本中实现了常量表达式特性,同时我们更新webcompiler.cloudapp.net上的网络编译器,使用最新的编译器开发版本。

由于之前我已经提到, 当前的编译器仅支持原始的C++11常量表达式特性。 C++14扩展常量表达式特性将会在未来实现,但在VS2015 RTM版本中并不会实现C++14扩展常量表达式特性。

在STL中, 我们已经实现了当前C++17标准文档N4527中提到的每一个常量表达式特性的用例,只有很少的一部分除外:

· 初始化列表中的min()/max()/minmax()函数(需要编译器支持C++14扩展常量表达式)

· min_element()/max_element()/minmax_element() 函数(原因同上)

· numeric_limits<float/double/long double>::quiet_NaN()/signaling_NaN() (我只能说编译器需要赋予神奇的力量)

· mutex的默认构造函数 (在我们放弃了对XP的支持后仍需要很大的修改)

· Error_category的默认构造函数(在之前的修复, 我使用与常量表达式特性不相符的reinterpret_cast。 当然我可以轻易地改变这些, RC版本到RTM版本中考虑一些因素暂且不会变化)

因为我运行了每个在STL中关于constexpr特性测试用例,并且编译器完全接受constexpr特性。 所以我才说我们最终实现了constexpr特性。所有的棘手问题已解决,像bitset接受unsigned long long类型的构造函数以及tuple的改造移动构造函数。

不可避免,还是有一些潜在鉴于此功能的bugs, 因此我们希望邀请你尝试使用网络编译器并报告给我们任何你发现的问题.(这星期就可以报告问题了) 我还没发现STL中关于constexpr特性的一些bugs,但还是有一些需要修复的编译器bug,特别是我们内部记录的编号1134662和编号1165072的bug。

Microsoft Connect是官方指定用来报告bug的网站, 此外我们也会处理博客评论中提及的consexpr特性的任何bug。

最后,鸣谢: 感谢Tanveer Gani在编译器工作中投入大量的时间, 感谢Dave Bartolomeo对/analyze开关进行修复。 常量化STL工作中也感谢P.J.Plauger和我自己 , 感谢Alex Voicu对<limits>头文件的修改.

Stephan T. Lavavej

高级开发工程师 - Visual C++类库团队

stl@microsoft.com