Gar*_*zet 4 c++ language-lawyer reinterpret-cast
我正在阅读类型别名规则,但无法确定此代码中是否包含 UB:
std::vector<std::byte> vec = {std::byte{'a'}, std::byte{'b'}};
auto sv = std::string_view(reinterpret_cast<char*>(vec.data()), vec.size());
std::cout << sv << '\n';
Run Code Online (Sandbox Code Playgroud)
我相当确定事实并非如此,但我经常对 C++ 感到惊讶。介于和 之间并且reinterpret_cast始终char*允许吗?unsigned char*std::byte*
此外,在此类转换中添加合法的内容,例如:const
std::array<char, 2> arr = {'a', 'b'};
auto* p = reinterpret_cast<const std::byte*>(arr.data());
Run Code Online (Sandbox Code Playgroud)
再次,我怀疑这是合法的,因为它说
AliasedType 是 DynamicType 的有符号或无符号变体(可能是 cv 限定的)
但我想reinterpret_cast一劳永逸地确定。
代码没问题。
\nchar*std::byte*标准允许为任何指针类型起别名。(要小心,因为相反的情况是不正确的)。
([基本类型]/2):
\n\n\n对于任何可复制类型 T 的对象(基类子对象除外),无论该对象是否拥有类型 T 的有效值,组成该对象的底层字节 ([intro.memory]) 都可以是\n n 复制到char、unsigned char 或 std\xe2\x80\x8b::\xe2\x80\x8bbyte \n([cstddef.syn])数组中。43如果该数组的内容被复制回对象,则该对象随后应保留其原始值。
\n
([基本.lval]/8.8):
\n\n\n如果程序尝试通过下列类型之一以外的泛左值来访问对象的存储值,则行为是未定义的:
\n\n
\n- char、unsigned char 或 std\xe2\x80\x8b::\xe2\x80\x8bbyte 类型。
\n
是的,您可以添加const.
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |