msvc 到现在都没有正确实现 if constexpr

2018-11-13 11:08:15 +08:00
 wutiantong

导致我新项目的代码不能在我的 surface book2 上正确编译,sad

3022 次点击
所在节点    C
9 条回复
ysc3839
2018-11-13 14:16:36 +08:00
wutiantong
2018-11-13 17:17:02 +08:00
@ysc3839 我肯定开启了 c++17 支持的,你看一下这个例子: https://godbolt.org/z/MzCry0,clang 和 gcc 都没问题,msvc 就会挂的莫名其妙
ysc3839
2018-11-13 19:00:22 +08:00
那可能是 bug ?
wevsty
2018-11-13 21:02:52 +08:00
稍微改了一下,在 MSVC 15.8 上加 /std:c++17 参数以后可以编译了。
(貌似也仅有这个版本的 MSVC 才能编译)
(当然 GCC 也可以通过编译)
代码:
https://godbolt.org/z/9BuPJL

原本的代码编译过不去一方面由于 MSVC 实现的原因,另一方面这种写法本身的移植性就比较玄学。

以下是不靠谱也不负责任的瞎掰:
调用 get<0>()的时候因为 index 模板的特化 index<0>本身并没有 get 模板(或者叫成员函数),大概 MSVC 并不认为这样做是合法的写法所以就扔了编译错误出来。
if constexpr 虽然是编译期决定的,但是翻了一下规定只说了 return 的返回值不参加类型推导,但是好像并没有说如果 return 的表达式本身不合法应该怎么做,那么这里就是一个未定义的灰色地带了。
wutiantong
2018-11-13 23:16:07 +08:00
@wevsty 感谢你提供的解决方案

不过这个恐怕仍然是 msvc 的 BUG,可以看一下这个: https://stackoverflow.com/a/50857419
wevsty
2018-11-14 00:11:15 +08:00
@wutiantong
反正从现象看 MSVC 对 if constexpr 的处理上显然是要求即使被丢弃的部分也不会简单的直接跳过的。

我个人是支持丢弃编译期就可以确定不会执行的内容的,不过这个问题可能是编译器编译逻辑或者对标准解释的问题。不太清楚 MS 是怎么考虑的,不过可以尝试给 MS 提交一下,也许下个版本他们就修过来或者给你一个解释也说不定。
FrankHB
2018-11-14 01:30:31 +08:00
给你报 bug 加点料:

https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance?view=vs-2017
这里明确支持 P0292R2,note G 还明确 C++14 模式都行。

http://eel.is/c++draft/stmt.if#2

During the instantiation of an enclosing templated entity, if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated.

因为你的例子中 after instantiation 以后 I 不再是 value-dependent,所以 discarded substatement 要求不能被实例化,没有什么疑问。

很迷的是这里下面的 example 是正确的,所以不是实现策略问题,就是个 bug。

另外注意 P0292R1 倒是没明确要求这个,但是非得说 P0292R2 嘛……。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0292r2.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0292r1.html
wutiantong
2018-11-14 14:15:30 +08:00
@FrankHB 算了,我不要去报 bug,大佬如果有兴趣的话不妨去报一下
FrankHB
2018-11-14 21:08:03 +08:00
之前报给 connect 的 bug 回得好好的莫名其妙就给吃了,改版以后更加尸骨无存,所以也懒得浪费时间了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/507306

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX