无法在编译时将数组转换为字符串视图 constexpr basic_string_view(const CharT* s, size_type count):constexpr basic_string_view(const CharT* s):constexpr basic_string_view(It first, End last):constexpr basic_string_view(R&& r)

问题描述

我试图在编译时将 1 个字符转换为 std::string_view,因为 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 并且我还将原始数组声明为 {{ 1}}。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)