使用折叠表达式初始化静态 constexpr class 数据成员不编译
Using fold expression to initialize static constexpr class data member doesn't compile
我对一段特定的代码感到困惑,即使非常相似的代码片段确实可以编译,它也不会编译。
这不会编译:
#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
没有帮助。
报告为可能的编译器错误:Bug report
编辑: 这是一个已确认的错误,已在 Visual Studio 2019 年发布修复。
我还将我的最终解决方案略微简化为以下内容:
static constexpr std::size_t BIT_COUNT = [](int i) { return i; }((GROUPS + ...));
我对一段特定的代码感到困惑,即使非常相似的代码片段确实可以编译,它也不会编译。
这不会编译:
#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
没有帮助。
报告为可能的编译器错误:Bug report
编辑: 这是一个已确认的错误,已在 Visual Studio 2019 年发布修复。
我还将我的最终解决方案略微简化为以下内容:
static constexpr std::size_t BIT_COUNT = [](int i) { return i; }((GROUPS + ...));