gpt4 book ai didi

C++20 bit_cast 与 reinterpret_cast

转载 作者:IT老高 更新时间:2023-10-28 23:00:53 27 4
gpt4 key购买 nike

根据 ISO C++ 委员会的最后一次 session ,bit-cast将在 C++20 标准中引入。

我知道 reinterpret_cast 不适合这份工作,因为 type aliasing rules但我的问题是,为什么他们选择不扩展 reinterpret_cast 以将对象视为位序列表示,而更愿意将此功能作为一种新的语言结构提供?

最佳答案

嗯,有一个明显的原因:因为它不会做 bit_cast 所做的所有事情。即使在我们可以在编译时分配内存的 C++20 世界中,reinterpret_cast 也被禁止在 constexpr 函数中使用。 bit_cast 的明确目标之一是能够在编译时做这些事情:

Furthermore, it is currently impossible to implement a constexpr bit-cast function, as memcpy itself isn’t constexpr. Marking the proposed function as constexpr doesn’t require or prevent memcpy from becoming constexpr, but requires compiler support. This leaves implementations free to use their own internal solution (e.g. LLVM has a bitcast opcode).

现在,您可以说您可以将 reinterpret_cast 的这种特定用法扩展到 constexpr 上下文。但这使规则变得复杂。与其简单地知道 reinterpret_cast 不能在 constexpr 代码段中使用,还不如记住 reinterpret_cast 不能使用的具体形式使用。

此外,还有一些实际问题。即使你想走 reinterpret_cast 路线,std::bit_cast 也是一个库函数。通过委员会获得库功能总是比语言功能更容易,即使它会获得一些编译器支持。

然后是更主观的东西。 reinterpret_cast 通常被认为是一种固有的危险操作,表明以某种方式“欺骗”了类型系统。相比之下,bit_cast 不是。它正在生成一个新对象,就像从现有对象中复制其值表示一样。它是一个低级工具,但它不是一个与类型系统混淆的工具。因此,将“安全”操作的拼写方式与“危险”操作的拼写方式相同会很奇怪。

确实,如果您确实以相同的方式拼写它们,就会开始质疑为什么这是合理定义的:

float f = 20.4f;
int i = reinterpret_cast<int>(f);

但这有点糟糕:

float f = 20.4f;
int &i = reinterpret_cast<int &>(f);

当然,语言律师或熟悉严格别名规则的人会理解为什么后者不好。但是对于外行来说,如果可以使用 reinterpret_cast 进行位转换,则不清楚为什么使用 reinterpret_cast 来转换指针/引用和将现有对象解释为转换后的类型。

不同的工具应该有不同的拼写。

关于C++20 bit_cast 与 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com