gpt4 book ai didi

c++ - 如何在 constexpr 函数内部的字符串文字上静态断言条件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:04 24 4
gpt4 key购买 nike

在下面的示例中,如果字符串文字以 'v' 开头,main 可以static_assert,但是验证不能。

为什么会这样?有没有办法允许 verify 对字符串文字中的字符进行 static_assert 条件?

#include <cstddef>

template <std::size_t N>
constexpr char get_first(const char (&str)[N])
{
static_assert(N>1, "must be > 1");
return str[0];
}

template <std::size_t N>
constexpr void verify(const char (&str)[N])
{
static_assert(str[0] == 'v', "must start from v");
}

int main()
{
static_assert(get_first("value") == 'v', "first must be 'v'"); // succeeds
verify("value"); // fails to compile
}

编译错误:

main.cpp: In instantiation of 'constexpr void verify(const char (&)[N]) [with long unsigned int N = 6]':
main.cpp:19:15: required from here
main.cpp:13:9: error: non-constant condition for static assertion
static_assert(str[0] == 'v', "must start from v");
^~~~~~~~~~~~~
main.cpp:13:9: error: 'str' is not a constant expression

Example .

最佳答案

我为您提供了另一种解决方法。这不会使用 static_assert 但保证在编译时强制执行条件。

#include <type_traits>
template<bool b>
using enforce = std::bool_constant<b>;

template <std::size_t N>
constexpr int verify(const char (&str)[N])
{
if(get_first(str) != 'v') {
throw "must start from v";
}
return 0;
}

int main()
{
using assertion = enforce<verify("value")>; // compiles
using assertion = enforce<verify("fail")>; // fails to compile
// or use it like
constexpr auto assertion0 = verify("value"); // compiles
}

这使用 throwing 在 constexpr 上下文中无效。您将收到的错误看起来像这样:

26 : <source>:26:31: error: non-type template argument is not a constant expression
using assertion = enforce<verify("fail")>; // fails to compile
^~~~~~~~~~~~~~
15 : <source>:15:9: note: subexpression not valid in a constant expression
throw "must start from v";
^
26 : <source>:26:31: note: in call to 'verify("fail")'
using assertion = enforce<verify("fail")>; // fails to compile

我们可以通过将 verify 用作模板参数来强制执行 constexpr 评估。这也是声明非 void 返回类型的原因。

关于c++ - 如何在 constexpr 函数内部的字符串文字上静态断言条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46761900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com