【问题标题】:constexpr errors; VS2017 C++ compiler regression?constexpr 错误; VS2017 C++ 编译器回归?
【发布时间】:2017-08-12 12:40:13
【问题描述】:

刚刚安装了 VS2017,它声称自 2015 年以来就拥有卓越的 C++14 支持(这是初级的)。 在我的一个使用 constexpr 的项目中试了一下,发现似乎有些回归。

这段代码:

struct s
{
    size_t i;
    constexpr s(nullptr_t) noexcept : i(0) {}
};
static_assert(s(nullptr).i == 0, "!!");

在 VS2015 和 Clang 上编译没有问题,但在 VS2017 中出现新错误:

error C2131: expression did not evaluate to a constant
note: failure was caused by unevaluable pointer value
note: while evaluating 's::s(&s{(null)})'

这段代码看起来不错吧? constexpr 是否意味着 nullptr 有问题?
我很惊讶这个基本的回归可能会出现,我怀疑我的代码一定有问题......

【问题讨论】:

  • 即使只是 constexpr s x{nullptr}; 也会因无意义的错误而失败(note: while evaluating 's::s(&x)' – 什么??);显然是一个错误。
  • 令我惊讶的是,如此简单和琐碎的事情可能会错过编译器单元测试......
  • 另一个在最简单的字符串拆分例程中引发相同错误的 sn-p 代码:while (*tmp) { if (a_delim == *tmp) { count++; last_comma = tmp; } tmp++; }
  • @ibanjo:你发布的代码与“同样的错误”有什么联系?
  • @Manu Evans:首先,错过单元测试通常是“简单而琐碎”的事情。复杂的功能经常与多个测试交互,至少触发其中一个。其次,即使你的代码很短,底层的语言语义也不一定是“简单而琐碎”的。

标签: c++ visual-c++ c++14 visual-c++-2017


【解决方案1】:

constexpr constructor(std::nullptr_t) 导致“错误 C2131:表达式未计算为常量”

这个问题是 reported 在 Visual Studio 2017 版本 15.1 中的一个错误。
OP (?) 早些时候报告了另一个 issue 的变体。

此问题已修复:Visual Studio 2017 版本 15.6 预览版 1

【讨论】:

  • 希望从未回答的问题列表中删除此问题。
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 2018-09-25
  • 2015-05-30
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
相关资源
最近更新 更多