Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;20带u8、字符8和标准::字符串_C++_Stdstring_C++20 - Fatal编程技术网

C++ C++;20带u8、字符8和标准::字符串

C++ C++;20带u8、字符8和标准::字符串,c++,stdstring,c++20,C++,Stdstring,C++20,C++11为我们带来了UTF-8文本的u8前缀,几年前我认为这很酷,并在我的代码中添加了如下内容: std::string myString = u8"●"; 这一切都很好,但问题出现在C++20中,它似乎不再编译,因为u8创建了一个char8_t*,这与仅使用char的std::string不兼容 我应该创建一个新的utf8string吗?在一个C++20世界中,我们有更多与标准std::string不匹配的显式类型,在这种情况下,一致且正确的方法是什么 我应该创建一个新的utf8strin

C++11为我们带来了UTF-8文本的u8前缀,几年前我认为这很酷,并在我的代码中添加了如下内容:

std::string myString = u8"●";
这一切都很好,但问题出现在C++20中,它似乎不再编译,因为u8创建了一个char8_t*,这与仅使用char的std::string不兼容

我应该创建一个新的utf8string吗?在一个C++20世界中,我们有更多与标准std::string不匹配的显式类型,在这种情况下,一致且正确的方法是什么

我应该创建一个新的utf8string吗

不,已经在那儿了。它不仅提出了
char8\u t
,而且还为名为
std::u8string
char8\u t
字符类型提出了新的
std::u8string
专门化。因此,这已经通过trunk中的
clang
libc++
进行编译:

const std::u8string str = u8"●";
u8
文本中断构造
std::string
的事实是不幸的。从提案中:

除了保留其不赞成的接口外,本提案未指定任何向后兼容性功能。作者认为这些特征是必要的,但单一的一组特征将不必要地损害本提案的目标。相反,我们的期望是实现将提供选项来支持更细粒度的兼容性特性


但是我想上面的大多数初始化应该是
grep
-可以的,或者受到一些自动
clang
工具修复的影响。

除了@lubgr的答案之外,本文还讨论了使用
char8\t
字符数组制作
std::string
的几种方法

基本上,您可以将
u8
char数组强制转换为“普通”char数组,以获得与C++17相同的行为,在此之前,您只需更加明确一点。本文讨论了实现这一点的各种方法

适合您的用例的最简单(但不是完全零开销,除非您添加更多重载)方法可能是最后一种,即引入显式转换函数:

std::string from_u8string(const std::string &s) {
  return s;
}
std::string from_u8string(std::string &&s) {
  return std::move(s);
}
#if defined(__cpp_lib_char8_t)
std::string from_u8string(const std::u8string &s) {
  return std::string(s.begin(), s.end());
}
#endif
我应该创建一个新的utf8string吗

否,C++20添加了
std::u8string
。但是,我建议改用
std::string
,因为
char8\u t
在标准中的支持很差,并且根本不受任何系统API的支持(并且可能永远不会因为兼容性原因)。在大多数平台上,正常的
char
字符串已经是UTF-8,在使用MSVC的Windows上,您可以使用
/UTF-8
进行编译,这将在主要操作系统上为您提供可移植的Unicode支持

例如,您甚至不能在C++20()中使用u8字符串编写Hello World程序:


std::cout这可能不方便,但您可以使用:
(常量字符*)u8“こんにちは"


或者生成两个参数为“const char*”和“const char8\t”的函数*目前看来,UTF8的所有倡导者都被扔到了总线下面,C++ 20提供了另一个有缺陷的不完全选项,以决定如何处理便携式代码的字符编码。char8_t进一步搅浑了一些已经非常脏的水。我已经能够用MSVC OpTePrVIEW来做一个最佳的间隙——从最新的C++工作草稿(/STD:C++最新)的特性来看,这是……/P>
#if defined(__cpp_char8_t)
template<typename T>
const char* u8Cpp20(T&& t) noexcept 
{ 
#pragma warning (disable: 26490)
   return reinterpret_cast<const char*>(t);
#pragma warning (default: 26490)
}
   #define U8(x) u8Cpp20(u8##x)
#else
   #define U8(x) u8##x
#endif
#如果已定义(uu cpp_char8_t)
模板
常量字符*u8Cpp20(T&T)无例外
{ 
#杂注警告(禁用:26490)
返回重新解释(t);
#杂注警告(默认值:26490)
}
#定义U8(x)u8Cpp20(U8##x)
#否则
#定义U8(x)U8##x
#恩迪夫
它丑陋、低效、令人讨厌。但它允许将旧版“utf8 everywhere”代码中的所有u8“”替换为u8“”。我计划避开char8_t,直到产品更加连贯和完整(或永远)。我们应该拭目以待,看看C++20最终会解决什么问题。目前,char8_t令人非常失望


如果有人感兴趣,我已经在github上发布了自己的UTF8Everywhere响应的开源示例(针对VisualStudio社区)u8string
应该专门处理utf8字符,但它仍然将它们视为字节数组而不是符号序列。必须重新实现索引和其他每符号操作,或者使用某些第三方字符串。因此
u8string
与常规
string
相比几乎没有任何好处,特别是如果utf8用于字符字符串编码,请注意,也可以从litereal推断模板的类型:
std::basic_string str=u8”●"。这在C++17和C++20中都有效,但在每种情况下都会分解为不同的类型。这一点非常重要,任何比这更大的提案都更难通过。鉴于我们打破向后兼容性的记录,这是一个小奇迹。有了这个构建块SG16(Unicode/文本研究组)有依据支持此答案中链接的P0482版本是初始版本。C++20接受的版本是,它用以下内容替换了引用的文本:
此提案没有指定任何向后兼容性功能,只是保留了它不赞成的接口。作者认为这些功能是必要的但是,一组这样的功能将不必要地损害本提案的目标。相反,我们的期望是,实现将提供选项,以实现更细粒度的兼容性功能。
这篇文章非常有启发性,我接受这个答案,因为它确实深入了问题的症结所在,它很难选择,因为两个答案都非常有用!Hm.至少还应该使用
std::string_view
来减少ca