Dans l'exemple suivant main
peut static_assert
si un littéral de chaîne commence par 'v'
, mais verify
ne peut pas.Comment faire pour affirmer une condition sur un littéral de chaîne à l'intérieur d'une fonction constexpr?
Pourquoi cela se produit-il? Y at-il un moyen d'autoriser verify
à static_assert
conditions sur les caractères dans un littéral de chaîne?
#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
}
Erreurs de compilation:
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
Si vous voulez un paramètre de chaîne, vous pouvez la compilation affirment, je suggère Hana. – chris