【发布时间】:2017-10-18 16:34:35
【问题描述】:
编译以下代码(godbolt):
constexpr bool f(const char *&s) {
do {
++s;
} while (*s);
return true;
}
constexpr bool g(const char *s) {
return f(s);
}
int main() {
static_assert(g("x"), "");
}
在 MSVC 上出现此错误:
err:seh:setup_exception stack overflow 1552 bytes in thread 0058 eip 000000007b48dad8 esp 0000000000131000 stack 0x130000-0x131000-0x1130000
而其他编译器(GCC 和 Clang)很乐意接受它。
为什么这段代码不能在 MSVC 上编译,我该如何解决?
【问题讨论】:
-
我能想到的唯一一件事是您在 进行空检查之前增加了指针。这将在空字符串上调用未定义的行为。我不知道为什么这里有问题。在 Godbolt 中更改代码以在递增之前进行检查似乎也不能解决问题。
-
很明显是一个错误。即使该代码无效,这也不是 MSVC 应该给您的消息。