C++ 为什么MSVC 2019在以三值形式返回静态大小的数组时失败?

C++ 为什么MSVC 2019在以三值形式返回静态大小的数组时失败?,c++,language-lawyer,C++,Language Lawyer,我试图编译一些,但遇到了一个错误;我简化了这个例子,我有下面的MVCE,它无法用MSVC 2019编译,错误是 错误C2440:“返回”:无法从“常量字符*”转换为“常量字符(&)[20]” 当我将三元运算符转换为适当的if语句时,代码编译得很好: static constexpr const char somethingWeird[] = "Well, that's odd..."; void fail() { throw 0; } // This works const

我试图编译一些,但遇到了一个错误;我简化了这个例子,我有下面的MVCE,它无法用MSVC 2019编译,错误是

错误C2440:“返回”:无法从“常量字符*”转换为“常量字符(&)[20]”

当我将三元运算符转换为适当的if语句时,代码编译得很好:

static constexpr const char somethingWeird[] = "Well, that's odd...";
void fail() { throw 0; }

// This works
constexpr const char(&checkNullTerminatedGood(const char(&a)[20]))[20]{
  if (a[19] == char(0)) {
    return decltype(a)(a);
  } else {
    return (fail(), decltype(a)(a));
  }
}
static constexpr const auto somethingElseNew = checkNullTerminatedGood(somethingWeird);
这是MSVC中的一个bug吗?第一个代码段使用GCC和Clang编译。

有一点表明这是一个据称已修复的代码段(但它不是)

解决方案 2017年9月7日凌晨2:35

感谢您的反馈!此问题已修复,将在Visual Studio 2017的下一次更新中提供。感谢您帮助我们构建更好的Visual Studio!”


你有没有试过不带任何例外<代码>失败()…您想要实现什么?我相信有比你的尝试更好的方法。对我来说这是经典。同样的事情,@bruno。将从MVCE中删除它。@MarekR我认为这不是XY问题;正如我所说:我正在MSVC上编译其他人的代码,但它失败了。我的问题是:这是编译器中的一个bug吗?是的,这显然是MSVC的一个bug(它默默地执行了数组到指针的不必要的衰减)(有一点),但我也不相信该代码,更喜欢其他代码。你能使用哪种版本的C++?所以看起来它实际上没有被固定。有趣的是,报告中包含了完全相同的代码:)。我猜他们也在研究问题中的库,但我不肯定。:-)我以前见过这个问题,并使用了它的一些代码作为复制器-似乎它仍然是一个问题,虽然。
static constexpr const char somethingWeird[] = "Well, that's odd...";
void fail() { throw 0; }

// This works
constexpr const char(&checkNullTerminatedGood(const char(&a)[20]))[20]{
  if (a[19] == char(0)) {
    return decltype(a)(a);
  } else {
    return (fail(), decltype(a)(a));
  }
}
static constexpr const auto somethingElseNew = checkNullTerminatedGood(somethingWeird);