代码之家  ›  专栏  ›  技术社区  ›  Language Lawyer

C++ 17在大的Endiad平台上实现吗?

  •  -3
  • Language Lawyer  · 技术社区  · 7 年前

    让我们看一下以下代码:

    int i = 10;
    char c = reinterpret_cast<char&>(i);
    

    [expr.reinterpret.cast]/11

    如果指向T1的指针类型的表达式可以使用重新解释转换显式转换为指向T2的指针类型,则可以将T1类型的glvalue表达式转换为指向T2的类型引用。结果引用与源glvalue相同的对象,但具有指定的类型。

    所以 reinterpret_cast<char&>(i) 使用指定的 char int i .

    初始化 c ,我们需要值,因此应用了左值到右值的转换 [conv.lval]/3.4 :

    glvalue所指示的对象中包含的值是prvalue结果。

    对象。只要价值 烧焦 [expr]/4 否则这就是UB),变量 应初始化为具有相同的值。

    从实现的角度来看,在一个小endian平台上,通过读取 内景

    如果你认为上面的代码可以很容易地被编译器处理,以产生一个按照C++ 17标准所要求的代码,那么就可以考虑将指针转换为 变成指向 烧焦 . 这种强制转换不会改变指针值,即它仍然指向 内景 对象 ,这意味着对具有以下L2R转换的指针应用间接运算符的行为应与上面描述的相同,即获取 内景 对象,如果它可由 烧焦

    在以下代码中

    int i = 10;
    f(reinterpret_cast<char*>(&i)); // void f(char*)
    

    编译器应该调整 如果它不知道函数 f 你同意它的论点吗?而且编译器也不知道将传递给函数的内容 f . 上面的代码和函数 f

    例如,如果 解引用指针读取通过它的值,它将得到 ,如上所述。但它也可以用指向实数的指针来调用 烧焦 f 无法调整给定的指针。这意味着调用者应该调整指针。但是如果 f 将指针传递给 memcpy 复制 sizeof(int) 内景 [basic.types]/3 ? 这是不容易想象如何调整指针在这里马赫所需的(双方) [基本类型]/3 [转换层]/3.4 )行为。

    真正地

    3 回复  |  直到 7 年前
        1
  •  8
  •   Community Mohan Dere    6 年前

    编辑:完全重写:你让我相信标准被打破了。


    glvalue所指示的对象中包含的值是prvalue结果。

    我同意字面解释可能会得出你所做的结论。

    根据你的解释, reinterpret_cast (以及根据 重新解释 )变得毫无用处,实现不仅在BE系统上是不可能的,而且在LE系统上也是不可能的(考虑在非整数类型和 char

    混淆的原因可能是对表达式的定义不够准确 “包含在中的值” , “结果引用同一对象”

        2
  •  5
  •   Kit.    7 年前

    [intro.object]/1 他说,对于非多态性物体,“对其中发现的值的解释是由物体的类型决定的 表达

    (重点是标准本身,不是我的)

    正如你所注意到的,在你的例子中这种表达的类型是 char int .

        3
  •  -1
  •   KevinZ    7 年前

    只有传递 i 周围。然而,与 reinterpret_cast<char&> ,您传递的是地址,因为引用只是指针的不同语法。因此, c 将获取的MSB的值 0 只要 sizeof(int) > 1 .

    你写的东西与以下东西无法区分:

    int i = 10;
    char c = *reinterpret_cast<char*>(&i);