Я пытаюсь реализовать политики, проводящие различные проверки ввода. Одной из этих политик должен быть 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() должен включать один из этих трех случаев - они должны тестироваться отдельно.
Изменить 2: замена return std::get<1>(t); на return 0; дает ожидаемое сообщение об ошибке static_assert (что меня еще больше смущает)
Я ожидаю сообщения «Контейнер имеет менее двух элементов», как вы описали. Я получаю его только в clang и gcc и работаю с MSVC (версия 15.9.4).
Godbolt нормально не работает даже для MSVC. А вы вместо этого пробовали 15.9.5?
Он также не работает с MSVC 15.9.5.
@Mirka: Кажется, это связанная проблема: developercommunity.visualstudio.com/content/problem/114721/…
Спасибо, сообщу как об ошибке VS.





Какого поведения вы ожидаете? Я получаю «ошибка C2338: в контейнере меньше двух элементов»., что означает сбой
static_assert, что то же самое сclangиgcc. Какая у вас версия MSVC?