扔掉指针上的标志是否合法

Is It Legal to Cast Away the Sign on a Pointer?

本文关键字:是否 标志 指针      更新时间:2023-10-16

我正在使用一个过时的代码库,该代码库使用unsigned char*来包含字符串。对于我的功能,我已经使用了string,但是有一个摩擦:

我不能在旧代码中使用任何#include <cstring>。从string复制到unsigned char*是一个费力的过程:

unsigned char foo[12];
string bar{"Lorem Ipsum"};
transform(bar.cbegin(), bar.cbegin() + min(sizeof(foo) / sizeof(foo[0]), bar.size()), foo, [](auto i){return static_cast<unsigned char>(i);});
foo[sizeof(foo) / sizeof(foo[0]) - 1] = '';

如果我只是这样做,我是否会遇到未定义的行为或别名问题:

strncpy(reinterpret_cast<char*>(foo), bar.c_str(), sizeof(foo) / sizeof(foo[0]) - 1);
foo[sizeof(foo) / sizeof(foo[0]) - 1] = '';

[unsigned] char的严格混叠规则有一个明确的例外,因此在字符类型之间转换指针将起作用。

特别是在N3690中[basic.types]说任何可复制的对象都可以复制到charunsigned char数组中,如果复制回来,则值是相同的。 它还说,如果您将相同的数组复制到第二个对象中,则两个对象是相同的。(第2和第3段)

[basic.lval] 表示通过 charunsigned char类型的左值更改对象是合法的。

我认为,BobTFish在评论中表达了对charunsigned char中的值是否放错了位置的担忧。 "字符"值本质上是char类型。 您可以将它们存储在unsigned char中,并在以后char使用它们 - 但这已经发生了。

(我建议编写一些内联包装器函数以使整个事情不那么嘈杂,但我认为代码片段是为了说明而不是实际使用。

编辑:删除使用static_cast的错误建议。

编辑2:章节和经文。