0

我试图std::string_view在编译时将 1 个字符转换std::string_viewconstexpr.

考试:

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.

4

0 回答 0