static_assert для использования функции constexpr - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь реализовать политики, проводящие различные проверки ввода. Одной из этих политик должна быть constexpr проверка нескольких условий на тип ввода.

Я создал минимальный пример, показывающий мои намерения: я ожидаю, что компилятор вернет данное сообщение об ошибке static_assert при работе с неправильным вводом. VS, кажется, игнорирует функцию constexpr my_policy (обе перегрузки), и поэтому я получаю ошибку C2338. GCC и Clang работают как положено во всех трех случаях.

Вы бы классифицировали это как ошибку VS? Есть ли способ преодолеть проблему?

С наилучшими пожеланиями!

#include <array>
#include <tuple>

template <typename Container, std::size_t MinSize>
constexpr bool is_of_min_size()
{
    return (std::tuple_size_v<Container> >= MinSize);
}

template <typename Container>
constexpr void check()
{
    static_assert(is_of_min_size<Container, 2>(),
    "Container has less than two elements.");
}

template <typename Container>
constexpr void my_policy(Container)
{
    check<Container>();
}

template <typename Container>
constexpr void my_policy()
{
    check<Container>();
}

template <typename Container>
auto main_call(Container const& t)
{
    check<Container>(); //works as expected in all 3 compilers (first error: "Container has less than two elements.", later on: array index out of bounds)

    my_policy(t); //returns the expected static_assert failure message in gcc and clange (in gcc as second error), returns 'array index out of bounds' in vs (ignoring static_assert completely)

    my_policy<Container>(); //as for my_policy(t)

    return std::get<1>(t);
}

int main()
{
    using WrongType = std::array<double, 1>;

    main_call(WrongType{}) ; //result for this case described in the function main_call
}

Редактировать: main_call() должен включать один из этих 3 случаев - они должны проверяться отдельно.

Редактировать 2: замена return std::get<1>(t); на return 0; дает ожидаемое static_assert сообщение об ошибке (что еще больше смущает меня)

...