【问题标题】:Why `std::countl_one` doesn't work for UTF character types?为什么 `std::countl_one` 不适用于 UTF 字符类型?
【发布时间】:2021-06-04 18:12:26
【问题描述】:

C++20 添加了std::countl_one。根据cppreference.com

仅当 T 为无符号整数类型(即unsigned charunsigned shortunsigned intunsigned longunsigned long long 或扩展的无符号整数类型)时,此重载才参与重载决议。

因此,它不适用于任何 UTF 字符类型(char8_tchar16_tchar32_t)或wchar_t。该函数对于实现 UTF 编码/解码很有用。排除是为了什么?我想在调用该函数之前可以转换为其他整数类型,但这似乎仍然是一个不必要的额外步骤。

【问题讨论】:

  • 不确定或我会回答,但我怀疑较新的字符类型尽可能不表现得像数字,而是用作描述字符的不透明数据。看起来很多数字都将它们排除在外,因此您不会无意中在整数上下文中使用不是逻辑上整数的东西(即使实际上,它总是存储为一个)(修复char 类型追溯是不可能的)。
  • @ShadowRanger 它们支持所有其他类型的算术(加、减、乘、除、按位等)。它不像 enum class 那样真正不支持任何类型的开箱即用算术。
  • 是的,我并不是说半途而废“是不是整数”这件事是有道理的,但我怀疑这就是它的根源。
  • UTF-8 是一种可变长度编码。它不能为所有可能的 unicode 点分配给唯一的 wchar_t。
  • @Ripi2 这有什么关系?

标签: c++ c++20


【解决方案1】:

std::countl_one 等。旨在处理 unsigned 类型。在提案P0553R4: Bit Operations 中,我们看到了一个确认它的小宣传:

目前,“无符号”要求不包括 std::byte 或 char 是有意的,即使在 char 是无符号的平台上也是如此。

鉴于此要求,这必然排除 char8_t 等带符号字符类型。

【讨论】:

  • char8_t 和我提到的所有其他类型都是无符号的。
  • 其实是一种不同的类型。 std::byte 也是。不幸的是,没有来自科纳会议的笔记,没有太多可以扩展的内容。
  • @AyxanHaqverdili:为了澄清这一点,整数类型可以是signed, unsigned, or neither。虽然字符类型的底层类型可能是无符号的,但字符类型本身永远不会被认为是无符号的。
  • @NicolBolas 这很有趣。如果我溢出wchar_t,这是未定义的行为吗? std::is_unsigned 似乎认为它没有签名。我不是在争论。我将简单地添加适当的演员表。谢谢你的解释。
  • @AyxanHaqverdili:之所以有效,是因为is_unsignedT(0)T(-1) 相互比较的方式明确定义(如果T 是一个整数类型)。
猜你喜欢
  • 2021-11-06
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2014-08-22
  • 2012-01-22
  • 2021-08-07
  • 2014-03-23
相关资源
最近更新 更多