Использование выражения сгиба для инициализации статического члена данных класса constexpr не компилируется - PullRequest
4 голосов
/ 13 марта 2019

Меня смущает конкретный фрагмент кода, который не будет компилироваться, даже если очень похожие фрагменты кода компилируются.

Это не скомпилируется:

#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>{};

Я компилирую с MSVC ++ в Visual Studio 15.9.8. Чего мне не хватает?

Редактировать: Я компилирую с флагом /std:c++17. Попытка /std:latest не помогла.

1 Ответ

4 голосов
/ 13 марта 2019

Сообщено как возможная ошибка компилятора: Отчет об ошибке

Редактировать: Это подтвержденная ошибка, и исправление было выпущено в Visual Studio 2019.

Я также немного упростил свое окончательное решение до следующего:

static constexpr std::size_t BIT_COUNT = [](int i) { return i; }((GROUPS + ...));
...