似乎有一些协议,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++ 并且是实际需要的新版本才能使其合法化吗?
是的,放置new
是必要的,否则你会违反严格的别名(赋值是访问权限).
以上是否合法?几乎(虽然它几乎适用于所有实现).您通过强制转换创建的指针不指向对象,因为(现在已销毁的)数组和int
对象不是指针可互换的 ; 使用std::launder((int*)buf)
,或者更好的是,使用展示位置new
的返回值.