Я пытаюсь реализовать политики, проводящие различные проверки ввода. Одной из этих политик должна быть 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
сообщение об ошибке (что еще больше смущает меня)