4

即使非常相似的代码可以编译,我也对无法编译的特定代码感到困惑。

这不会编译:

#include <bitset>
template<std::size_t ...GROUPS>
class Foo
{
    static constexpr std::size_t BIT_COUNT = (GROUPS + ...);
    using Bits = std::bitset<BIT_COUNT>;
    Bits bits;
};

class Bar : public Foo<6, 6, 6, 6>{};

具有启发性的错误1>c:\...\source.cpp(5): error C2059: syntax error: '...'

这编译:

#include <bitset>
template<std::size_t ...GROUPS>
class Foo
{
    using Bits = std::bitset<(GROUPS + ...)>;
    Bits bits;
};

class Bar : public Foo<6, 6, 6, 6>{};

这也编译:

#include <bitset>
template<auto... t>
constexpr auto static_sum()
{
    return (t + ...);
}

template<std::size_t ...GROUPS>
class Foo
{
    static constexpr std::size_t BIT_COUNT = static_sum<GROUPS...>();
    using Bits = std::bitset<BIT_COUNT>;
    Bits bits;
};

class Bar : public Foo<6, 6, 6, 6>{};

我在 Visual Studio 15.9.8 中使用 MSVC++ 进行编译。我错过了什么?

编辑:我正在用/std:c++17标志编译。尝试/std:latest没有帮助。

4

1 回答 1

4

报告为可能的编译器错误:错误报告

编辑:这是一个已确认的错误,并且已在 Visual Studio 2019 中发布了修复程序。

我还稍微简化了以下最终解决方案:

static constexpr std::size_t BIT_COUNT = [](int i) { return i; }((GROUPS + ...));
于 2019-03-12T21:34:29.010 回答