gpt4 book ai didi

c++ - void* 与 static_cast 对比 intptr_t 与 reinterpret_cast

转载 作者:IT老高 更新时间:2023-10-28 22:28:28 25 4
gpt4 key购买 nike

我想知道两种不同类型的非常特殊类型的转换表之间是否存在特定的、基于标准的差异。特别是,给定:类型 T 和变量 T * object 是:

intptr_t opaque = reinterpret_cast<intptr_t>( object );
T * result = reinterpret_cast<T*>( opaque );

相当于:

void * opaque = static_cast<void*>( object );
T * result = static_cast<T*>( opaque );

我只关心result,它是否保证是相同的值,相当于任何类型T的原始object?我不在乎中间 opaque 有什么位模式,因为我相信标准技术上允许它们在每种情况下都不同(尽管没有理智的编译器会产生不同的结果)。

注意,我对 static_castreinterpret_cast 的一般情况不感兴趣,我很了解。我感兴趣的是上述非常具体的情况——标准将特殊逻辑分配给 static_castvoid* 使其行为类似于 reinterpret_cast(StackOverflow 上有几个相关的问题,但它们更通用,我认为我的场景非常具体)

抛开风格和偏好不谈,是否有任何技术原因为什么应该使用一种形式?还是保证所有 T 产生相同的最终 result 变量?

最佳答案

是的,两者都保证恢复原始指针值。

第一个由C++11 5.2.10/5指定:

A pointer converted to an integer of sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value;

第二个由C++11 5.2.9/13指定:

A value of type pointer to object converted to “pointer to cv void” and back, possibly with different cv-qualification, shall have its original value.

选择第二个版本而不是第一个版本是有技术原因的:intptr_t 是可选的,但每个实现都有 void*

关于c++ - void* 与 static_cast 对比 intptr_t 与 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917045/

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