问题标签 [char-traits]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 从捕获 constexpr 函数返回值的变量中删除 constexpr 会删除编译时评估
考虑以下constexpr
函数,static_strcmp
它使用 C++17 的constexpr
char_traits::compare
函数:
godbolt显示这在编译时得到评估,并优化为:
constexpr
从中删除bool result
:
如果我们删除constexpr
from constexpr bool result
,现在调用不再优化。
Godbolt显示我们现在调用memcmp
:
添加短路length
检查:
如果我们在调用之前char_traits::length
先比较in 中的两个参数,而没有on ,则调用会再次被优化掉。static_strcmp
char_traits::compare
constexpr
bool result
Godbolt显示我们回到了被优化的调用:
- 为什么
constexpr
从初始调用中删除static_strcmp
会导致持续评估失败? - 很明显,即使没有
constexpr
,调用也会在编译时进行评估,那么为什么在第一个版本中char_traits::length
没有相同的行为呢?constexpr
static_strcmp
c++ - 是否可以使用 std::char_traits在 GCC 8 之前的常量表达式中?
根据GCC 8 Release Note,现在可以在常量表达式中使用std::char_traits<char>
and :std::char_traits<wchar_t>
- 改进了对 C++17 的实验性支持,包括以下功能:
- std::char_traits 和 std::char_traits<wchar_t> 可用于常量表达式。
std::char_traits<char>
我在这里的理解是在 GCC 8 之前你不能在常量表达式中使用。
但是,以下代码可以很好地与GCC 7.5一起编译:
那么,在 GCC 8 之前是否可以在常量表达式中使用 std::char_traits ?还是我错过了什么?
c++ - 为什么 std::basic_fstream不行吗?
尝试编译此代码时:
编译器会警告我从调用到unsigned char
的oh-not-so-healthy 转换到. 事实上,它只是一个 typedef ,人们可能会认为使用而不是允许他们在没有警告的情况下编译上面的代码,正如预期的模板类型指针一样。char
write()
std::fstream
std::basic_fstream<char>
std::basic_fstream<uint8_t>
write()
这当然可行,但又出现了另一个问题。即使这段代码编译得很好:
write()
即使以前的版本正在运行,它现在也会在调用 时失败(忽略编译器警告)。我花了一段时间来确定标准 C++ 库代码中异常是从哪里引发的,但我仍然不太明白这里的情况。它看起来std::basic_fstream
使用了一些字符编码机制,并且由于定义了一个 forchar
但没有定义 for unsigned char
,因此文件流在尝试使用“错误”字符数据类型时会默默地失败......至少我是这么看的。
但这也是我不明白的。不需要任何字符编码。我什至不以文本模式打开文件,我想处理二进制数据。这就是为什么我使用类型数组而uint8_t
不是 char 的原因,使用这种数据类型而不是普通的 old 感觉更自然char
。但在我决定放弃uint8_t
数据类型并接受使用char
缓冲区或开始使用byte
定义为 的自定义数据类型的数组之前char
,我想问两个问题:
- 究竟是什么机制阻止我使用无符号字符数据类型?它真的与字符编码有关,还是有其他用途?为什么文件流适用于有符号字符数据类型,但不适用于无符号数据类型?
- 假设我仍然想使用
std::basic_fstream<uint8_t>
,无论它多么(不)合理 - 有没有办法实现这一点?
c++ - 是否保证 std::char_traits::to_int_type(c) == static_cast(C)?
问题如何正确使用std::cin.get()
and的返回值std::cin.peek()
?让我想知道是否可以保证
对于所有char
有效值c
。
这出现在很多地方。例如,istream::peek
调用streambuf::sgetc
,用于to_int_type
将char
值转换为int_type
. 现在,std::cin.peek() == '\n'
真的意味着下一个字符是\n
?
以下是我的分析。让我们从[char.traits.require]和[char.traits.specializations.char]收集碎片:
对于每个
int
值e
,to_char_type(e)
返回c
, 如果eq_int_type(e, to_int_type(c))
对于一些c
;其他一些未指定的值。
对于每对
int
值e
和f
,eq_int_type(e, f)
返回eq(c, d)
, 如果e == to_int_type(c)
和f == to_int_type(d)
对于一些c
和d
;true
, 如果e == eof()
和f == eof()
;false
, 如果e == eof()
异f == eof()
或;否则未指定。
eof()
返回一个值e
,使得!eq_int_type(e, to_int_type(c))
所有c
.eq(c, d)
当且(unsigned char) c == (unsigned char) d
当
现在,考虑这个假设的实现:(语法简化)
注意
(属性1)从
unsigned char
到的转换int
是保值的;(属性 2)从
char
to的转换unsigned char
是双射的。
现在让我们验证要求:
对于每一个
int
值e
,如果eq_int_type(e, to_int_type(c))
对于一些c
,那么e == int(c) + 1
。因此,to_char_type(e) == char(int(c)) == c
。对于每对
int
值e
andf
,如果e == to_int_type(c)
和f == to_int_type(d)
对于一些c
andd
,则当且eq_int_type(e, f)
当当int(c) + 1 == int(d) + 1
当c == d
(通过属性 1)。EOF 案例也很容易验证。对于每个
char
值c
,int(c) >= -128
, 所以int(c) + 1 != EOF
。因此,!eq_int_type(eof(), to_int_type(c))
。对于每对
char
值c
和d
,eq(c, d)
当且仅当(unsigned char) c == (unsigned char d)
(通过属性 2)。
这是否意味着这个实现符合要求,因此std::cin.peek() == '\n'
没有做它应该做的事情?我在分析中遗漏了什么吗?
c++ - 如何将 std::string 分配给 std::basic_stringLinux 上的 (Unicode2String)
我正在使用 Linux 系统,我认为标准 Linuxstd::string
支持 Unicode 和 ASCII 字符。所以,我想std::string
在我的代码中使用,但我从应用程序接收格式为std::basic_string<unsigned short int, TRAIT_CLASS>
(支持 Windows 和 Linux)的字符串。TRAITS_CLASS
如下:
如何std::string
为上述std::basic_string
模板分配法线?喜欢:
如果无法分配,我该如何使用上述basic_string
模板?