我想用 C++ 解析 UTF-8。解析新字符时,我事先不知道它是 ASCII 字节还是多字节字符的前导,也不知道我的输入字符串是否足够长以包含剩余的字符。
为简单起见,我想将接下来的四个字节命名为a
、和b
,并且因为我在 C++ 中,所以我想使用引用来完成它。c
d
只要我在知道访问是安全的之前不访问它们,在函数的开头定义这些引用是否有效?例子:
void parse_utf8_character(const string s) {
for (size_t i = 0; i < s.size();) {
const char &a = s[i];
const char &b = s[i + 1];
const char &c = s[i + 2];
const char &d = s[i + 3];
if (is_ascii(a)) {
i += 1;
do_something_only_with(a);
} else if (is_twobyte_leader(a)) {
i += 2;
if (is_safe_to_access_b()) {
do_something_only_with(a, b);
}
}
...
}
}
上面的例子显示了我想要在语义上做的事情。它没有说明我为什么要这样做,但显然真正的代码会涉及更多,所以只有当我知道访问是安全的并且我需要它们时才定义 b、c、d 会太冗长。