相关疑难解决方法(0)

用相同类型的对象覆盖对象

以下是否定义明确?

#include <iostream>
#include <string.h>

using namespace std;

struct Const {
    const int i; 
    Const (int i) : i(i) {}
    int get0() { return 0; } // best accessor ever!
};

int main() {
    Const *q,*p = new Const(1);
    new (p) Const(2);
    memcpy (&q, &p, sizeof p);
    cout << q->i;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意,在构造第二个之后Const,p在语义上(故意?)指向新对象,并且第一个已经消失,因此它可以"用作void*".但是第二个对象是在完全相同的地址构造的,因此位模式p表示新对象的地址.

评论

new (p) Const(2)擦除存储在的旧对象p,因此指针不再有效,除非作为指向storage(void*)的指针.

我想恢复p作为一个的价值Const*.

评论2

在任何一个p->~Const()或 …

c++ const placement-new memcpy language-lawyer

4
推荐指数
1
解决办法
304
查看次数

指针变量只是与某些运算符整数还是"符号"?

编辑:原始的单词选择令人困惑.术语"象征性"比原始术语("神秘")要好得多.

在关于我以前的C++问题的讨论中,我被告知指针是

这并没有健全的权利!如果没有任何符号,并且指针是其表示,那么我可以执行以下操作.我可以吗?

#include <stdio.h>
#include <string.h>

int main() {
    int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
    if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
        printf ("pa1 == pb\n");
        *pa1 = 2;
    }
    else {
        printf ("pa1 != pb\n");
        pa1 = &a[0]; // ensure well defined behaviour in printf
    }
    printf ("b = %d *pa1 = %d\n", …
Run Code Online (Sandbox Code Playgroud)

c++ pointers undefined-behavior language-lawyer

-2
推荐指数
1
解决办法
462
查看次数