用于指针和引用转换的 `reinterpret_cast` 是否完全被新 C++ 标准的功能所取代?

问题描述 投票:0回答:1
C++中的

reinterpret_cast
被很多人认为是危险的,并且在不调用UB的情况下很难正确使用它。它也有各种不同的用法,无法很好地传达演员阵容背后的意图。最近的标准添加了许多旨在保留底层对象表示的类型转换功能,包括但可能不限于
std::bit_cast
std::span::as_bytes
std:span::as_writable_bytes
,以及
std::start_lifetime_as
std::start_lifetime_as_array
。这让我想知道在较新的代码中是否有与这些对应的
reinterpret_cast
用法的任何原因。

也许问题标题并不完全准确,但我感兴趣的是

reinterpret_cast
在对应于标准草案中的第7项和第11项(也许还有第10项)的新代码中是否有任何实际用途。我对详细的答案感兴趣,说明每种用法如何被取代或不被取代,以及在它们被取代的情况下替代它们的推荐方式是什么。我知道
reinterpret_cast
还有许多其他用途,这些用途不会被语言中的新功能所取代。

  1. 对象指针可以显式转换为不同类型的对象指针。57当对象指针类型的纯右值 v 为 转换为对象指针类型“pointer to cv T”,结果为 static_cast(static_cast(v))。

  2. ...

  3. ...

  4. 类型“指向类型 T1 的 X 成员的指针”的纯右值可以显式转换为不同类型“指向类型 T1 的成员的指针”的纯右值。 如果 T1 和 T2 都是函数类型或两者都是函数类型,则为 T2 类型的 Y 成员 对象类型。58 空成员指针值 ([conv.mem]) 是 转换为目标类型的空成员指针值。 此转换的结果未指定,但以下情况除外 案例:

  5. 如果可以将“指向 T1 的指针”类型的表达式转换为“对 T2 的引用”类型,则指定对象 x 的 T1 类型的泛左值可以转换为“对 T2 的引用”类型 使用 a 显式转换为“指向 T2 的指针”类型 重新解释_演员。结果是 *reinterpret_cast(p) 其中 p 是指向“指向 T1 的指针”类型的 x 的指针。没有临时的 创建,没有复制,也没有构造函数([class.ctor])或 调用转换函数([class.conv])。59


57 类型可以有不同的 cv 限定符,但要遵守 reinterpret_cast 不能放弃常量性的总体限制。
58 T1 和 T2 可以有不同的 cv 限定符,但要遵守 reinterpret_cast 不能放弃常量性的总体限制。
59 当结果引用与源泛左值相同的对象时,这有时被称为类型双关语。

c++ pointers reinterpret-cast
1个回答
1
投票

std::bit_cast
std::start_lifetime_as
不会取代
reinterpret_cast
,它们是
reinterpret_cast
从未有过的新功能。
std::span::as_bytes
是一个方便的功能,它对
std::dynamic_extent
的帮助与包装演员一样多。

所以

reinterpret_cast
的有用用法没有改变。改变的是,人们使用
reinterpret_cast
和未定义行为的结构有了定义的行为替代。

© www.soinside.com 2019 - 2024. All rights reserved.