首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >长*和int*之间的转换时(长) ==大小(Int)

长*和int*之间的转换时(长) ==大小(Int)
EN

Stack Overflow用户
提问于 2014-05-23 12:47:54
回答 2查看 157关注 0票数 2

我们一般都知道sizeof(long) != sizeof(int)。但是(C++11)标准的哪些部分不允许通过int*long*进行混叠?这仅仅是因为conv.ptr中的遗漏,basic.lval中的混叠规则,还是其他什么原因?

代码语言:javascript
复制
void f()
{
    static_assert(sizeof(int) == sizeof(long), "");
    long x[] = {1, 2};
    int* y = x; // error: invalid conversion from ‘long int*’ to ‘int*’ [-fpermissive]
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-23 14:01:56

是的,这是[conv.ptr]中的遗漏,适用的段落在[expr.reinterpret.cast]中,

7对象指针可以显式转换为不同类型的对象指针。当“指向T1的指针”类型的are转换为“指针到cv T2”类型时,如果T1和T2都是标准布局类型(3.9),并且T2的对齐要求并不比T1严格,或者如果这两种类型都是无效的,则结果是static_cast<cv T2*>(static_cast<cv void*>(v))。将“指针到T1”类型的prvalue转换为“指向T2的指针”类型(其中T1和T2是对象类型,T2的对齐要求并不比T1更严格),并返回到原始类型产生原始指针值。任何其他此类指针转换的结果都是unspecified。

你必须使用reinterpret_cast<int*>(...)

编辑.在我的评论中有一个问题,我在这个编辑中更加明显,这不是一个语言律师问题,而是意图使用指针。我不知道这种担忧是如何产生的,因为很明显,我们可以不问就简单地进行C转换,但是如果存在疑问,那么指向int*的指针转换就违反了strict aliasing规则。

也就是说,可能会出现未定义的行为,因为您打破了编译器的假设,即不同类型的指针永远不能指向相同的内存位置。

票数 0
EN

Stack Overflow用户

发布于 2014-05-23 14:26:20

longint是两种不同的类型,即使它们大小相同,所以我认为无效的转换是由basic.lval.10造成的。

如果程序试图通过除下列类型之一以外的glvalue访问对象的存储值,则行为是未定义的:

  • 对象的动态类型,
  • 对象的动态类型的cv限定版本,
  • 类似于对象的动态类型的类型(如4.4中所定义的),
  • 对象的动态类型对应的有符号或无符号类型的类型,
  • 对象的动态类型的cv限定版本对应的有符号或无符号类型的类型,
  • 在其元素或非静态数据成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含的联合的元素或非静态数据成员),
  • 对象的动态类型的(可能是cv限定的)基类类型的类型,
  • 字符类型或无符号字符类型。

另外,如果basic.lval不存在,还会有其他问题:相同的大小并不意味着相同的表示/范围。

不能保证int中的值位与long中的值位精确对应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23829696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档