代码之家  ›  专栏  ›  技术社区  ›  vehomzzz

这是什么意思?重新解释cast<char*&>(a)=cp;

  •  1
  • vehomzzz  · 技术社区  · 15 年前

    是的,这不是很便携,我想知道为什么人们会想做这样的事情:`

    char *cp ;
    reinterpret_cast<char *&>(a) = cp;
    

    `什么意思?

    谢谢

    3 回复  |  直到 15 年前
        1
  •  2
  •   Alexander Gessler    15 年前

    a 被铸造成 char*& . 它被称为 reinterpret_cast

    原因 cp 到。 reinterpret_cast<char *>(a) = cp

    它在源代码中看起来有点难看。这个:

    char* c = reinterpret_cast<char*>(a);
    c = cp;
    

    可能更好地维护和读取,尽管它更长(注意,它的含义并不完全相同,因为我们引入了一个额外的变量 c 的内存被重用以指向新位置 内容提供商 ).

        2
  •  0
  •   GManNickG    15 年前

    有些人对演员阵容中的引用感到困惑。如果没有参考,我们会得到这样的结果:

    T a; // whatever a is, we don't know
    char* cp; // or something convertible to char*
    
    // remember, this is not what actually gets generated
    char* some_temporary_rvalue = reinterpret_cast<char*>(a);
    some_temporary_rvalue = cp; // illegal, and senseless
    

    T a; // whatever a is, we don't know
    char* cp; // or something convertible to char*
    
    char*& a_treated_as_charptr = reinterpret_cast<char*&>(a);
    a_treated_as_charptr = cp; // assigns a char* that is at &a
    
        3
  •  -1
  •   David Rodríguez - dribeas    15 年前

    有趣的是,问题中缺少的是 a

    T *a;
    char* p = "Hello";
    reinterpret_cast<char*&>(a) = p;
    

    假设

    T *a;
    char *p = "Hello";
    a = reinterpret_cast<T*>(p); // convert p to a T* and assign
    

    区别在于,在第一个版本中,强制转换是在赋值的左侧(LHS)执行的,因此必须是对引用(左值)的强制转换,而在第二个版本中,强制转换是在右侧(RHS)执行的,因此右值就足够了,不需要强制转换到引用。

    现在,在一般情况下,这两种类型有差异。Reinterpret cast只会按照您告诉它的类型“重新解释”内存。如果 char* 大小相同(在上述假设下,所有指针的大小都相同),则两个操作相同并产生相同的结果。

    另一方面,如果一种类型大于另一种类型,则这两种操作是不等价的。如果 sizeof(a) > sizeof(char*) 第一个版本将重新解释变量并只覆盖第一个 sizeof(char*) 字节 价值 p . 第二种情况是 sizeof(a) 内存位置的字节数 第页 (导致未定义的行为,因为它将读取变量之外的内容)并复制这些字节,覆盖 .

    相反,如果 sizeof(a) < sizeof(char*) 导致未定义的行为,而第二个行为将覆盖 有了第一个 尺寸(a) 字节输入 第页 .