我试图std::string_view
在编译时将 1 个字符转换std::string_view
为constexpr
.
考试:
consteval void test() {
constexpr auto str = char_to_string<'1'>();
}
这是char_to_string
函数的定义:
template <char N>
consteval std::string_view char_to_string() {
...
}
我尝试了不同的构造函数std::string_view
,但它们都不起作用:
constexpr basic_string_view(const CharT* s, size_type count)
:
原始数组:
constexpr const char arr[] = {N, '\0'};
return {arr, 1}; // even if I cast `arr` explicitly to `const char*`
std::array
:
constexpr std::array arr = {N, '\0'};
return {arr.data(), 1};
constexpr basic_string_view(const CharT* s)
:
原始数组:
constexpr const char arr[] = {N, '\0'};
return arr; // or `{arr}`
std::array
:
constexpr std::array arr = {N, '\0'};
return arr.data(); // or `{arr.data()}`
constexpr basic_string_view(It first, End last)
:
原始数组:
constexpr const char arr[] = {N};
return {std::ranges::begin(arr), std::ranges::end(arr)};
std::array
:
constexpr std::array arr = {N};
return {arr.begin(), arr.end()}; // `{arr.cbegin(), arr.cend()}` won't work either
constexpr basic_string_view(R&& r)
好吧,这是 C++ 23 的补充,并且 libstdc++ 已经实现了它。
原始数组:
constexpr const char arr[] = {N};
return std::ranges::subrange(std::ranges::begin(arr), std::ranges::end(arr));
std::array
:
constexpr std::array arr = {N};
return arr;
所有这些都将失败并共享一个常见的编译器错误:
std::string_view{...}
不是常量表达式
我不知道为什么,但是所有std::string_view
构造函数都已声明constexpr
并且std::array
已经声明,constexpr
并且我还将原始数组声明为constexpr
.