当前位置:  开发笔记 > 编程语言 > 正文

将int放入char数组是否合法需要放置?

如何解决《将int放入char数组是否合法需要放置?》经验,为你挑选了1个好方法。

似乎有一些协议,char由于C++别名规则,你不能毫无疑问地将一个int(一个int*)指向一个数组.

从另一个问题 - 基于通用char []的存储和避免严格别名相关的UB - 它似乎允许(重新)通过新的放置使用存储.

alignas(int) char buf[sizeof(int)];

void f() {
  // turn the memory into an int: (??) from the POV of the abstract machine!
  ::new (buf) int; // is this strictly required? (aside: it's obviously a no-op)

  // access storage:
  *((int*)buf) = 42; // for this discussion, just assume the cast itself yields the correct pointer value
}

那么,上面是合法的C++ 并且是实际需要的新版本才能使其合法化吗?



1> Columbo..:

是的,放置new是必要的,否则你会违反严格的别名(赋值是访问权限).

以上是否合法?几乎(虽然它几乎适用于所有实现).您通过强制转换创建的指针不指向对象,因为(现在已销毁的)数组和int对象不是指针可互换的 ; 使用std::launder((int*)buf),或者更好的是,使用展示位置new的返回值.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有