c++ - std::string 和 std::u16string (或 u32string)之间的区别

标签 c++ string c++11 output

在此处提问之前,我已经引用了以下帖子:

std::string, wstring, u16/32string clarification
std::u16string, std::u32string, std::string, length(), size(), codepoints and characters

但他们没有回答我的问题。看下面的简单代码:

#include<iostream>
#include<string>
using namespace std;

int main ()
{
  char16_t x[] = { 'a', 'b', 'c', 0 };
  u16string arr = x;

  cout << "arr.length = " << arr.length() << endl;
  for(auto i : arr)
    cout << i << "\n";
}

输出为:

arr.length = 3  // a + b + c
97
98
99

鉴于此,std::u16stringchar16_t 组成,而不是由 char 组成,输出不应为:

arr.length = 2  // ab + c(\0)
<combining 'a' and 'b'>
99

请原谅我的新手问题。我的要求是弄清楚新的 C++11 字符串的概念。

编辑:

从@Jonathan的回答中,我的问题出现了漏洞。我的观点是,如何初始化char16_t,使arr的长度变为2(即ab , c\0)。
仅供引用,下面给出了不同的结果:

  char x[] = { 'a', 'b', 'c', 0 };
  u16string arr = (char16_t*)x;  // probably undefined behavior

输出:

arr.length = 3
25185
99
32767

最佳答案

否,您创建了一个包含四个元素的数组,第一个元素是 'a' 转换为 char16_t,第二个元素是 'b' code> 转换为 char16_t

然后从该数组(转换为指针)创建一个 u16string,它读取每个元素直到 null 终止符。

关于c++ - std::string 和 std::u16string (或 u32string)之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24952008/

相关文章:

c++ - rdstate() 返回值是什么意思?

c++ - 使用 Cg :compile error:semantic "POSITION" not visible in this profile 进行体绘制

android - 在 strings.xml 中存储十六进制颜色值

c++ - 如何将字符串(包含双最大值)转换为 double

c++ - 可以在尾随返回类型语法中直接使用参数值(不是它的类型而是值本身)

c++ - 分配具有可变长度数组成员的结构

c++ - 从另一个线程调用 socket->native_handle()

c# - 允许用户在 Windows 控制台中键入任意数量的字符串,然后显示有关已键入的字符串中的字母数和行号的信息

c++ - push_back vs emplace_back

c++ - 迭代器失效规则是否意味着线程安全?