C++ 静态断言一个constexpr函数

C++ 静态断言一个constexpr函数,c++,constexpr,static-assert,C++,Constexpr,Static Assert,我正在尝试执行执行不同输入检查的策略。其中一个策略应该是constexpr检查输入类型上的一些条件 我创建了一个简单的示例来说明我的意图:我希望编译器在处理不正确的输入时返回给定的static\u assert失败消息。VS似乎忽略了constexpr函数my_policy(两个重载),这就是我得到错误C2338的原因。GCC和Clang在所有三种情况下都按预期工作 你会把它归类为VS错误吗?有没有办法克服这个问题 致以最良好的祝愿 #include <array> #include

我正在尝试执行执行不同输入检查的策略。其中一个策略应该是
constexpr
检查输入类型上的一些条件

我创建了一个简单的示例来说明我的意图:我希望编译器在处理不正确的输入时返回给定的
static\u 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
}
#包括
#包括
模板
constexpr bool的大小为
{
返回(std::tuple\u size\u v>=MinSize);
}
模板
constexpr无效检查()
{
静态\u断言(是\u最小\u大小(),
“容器含有少于两种元素。”);
}
模板
constexpr void my_策略(容器)
{
检查();
}
模板
constexpr void my_policy()
{
检查();
}
模板
自动主控呼叫(集装箱const&t)
{
check();//在所有3个编译器中都能正常工作(第一个错误:“容器的元素少于两个。”,后面是:数组索引超出范围)
my_policy(t);//在gcc和clange中返回预期的静态_断言失败消息(在gcc中作为第二个错误),在vs中返回“数组索引超出界限”(完全忽略静态_断言)
my_policy();//至于my_policy(t)
返回std::get(t);
}
int main()
{
使用错误类型=std::array;
main_调用(错误类型{});//函数main_调用中描述的这种情况的结果
}
编辑:
main\u call()


编辑2:替换
返回std::get(t)
返回0
提供预期的
静态断言
失败消息(这让我更加困惑)

您预期的行为是什么?我得到了“error C2338:Container少于两个元素。”这是
静态断言
失败,这与
clang
gcc
是一样的。你的MSVC版本是什么?我希望消息“Container少于两个元素”,正如你所描述的。我只在clang和gcc中得到它,我与MSVC(版本15.9.4)一起工作。即使对于MSVC,godbolt也会正常失效。你试过15.9.5吗?MSVC 15.9.5也失败了。@Mirka:这似乎是一个相关的问题: