【发布时间】: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