批准的方法避免左值投射警告和错误?

时间:2015-08-02 04:56:22

标签: c++ gcc casting lvalue

这与JoGusto在Casting Error: lvalue required as left operand of assignment的回答有关。在答案中,他/她说:

  

但有一种情况并非如此:转换,然后取消引用指针:

<div class="main-wrapper">
  <button id="hide-show" name="Click me">Click me</button>
  <div id="panel">
    <div class="wrapper">
      <div class="col">
        <p>Hello world! 2</p>
        <div id="img-1" class="images"></div>
      </div>
      <div class="col" id="testing">
        <p>Hello world! 3</p>
      </div>
      <div class="col">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit veniam quisquam, rem illum dicta cumque, voluptate fugiat impedit beatae rerum ratione, voluptates nisi voluptate fugiat consectetur adipisicing elit. Suscipit veniam quisquam,
          rem illum dicta cumque, voluptate fugiat impedit beatae rerum ratione, voluptates nisi voluptate fugiat consectetur adipisicing elit. Suscipit veniam quisquam, rem illum dicta cumque, voluptate fugiat impedit beatae rerum ratione. Lorem ipsum
          dolor sit amet, consectetur adipisicing elit. Suscipit veniam quisquam, rem illum dicta cumque, voluptate fugiat impedit beatae rerum ratione, voluptates nisi voluptate fugiat consectetur adi</p>
      </div>
    </div>
  </div>

  <p>Hello world! 4</p>
</div>

我想我在约瑟夫曼斯菲尔德的答案中找到了Why does an lvalue cast work?的答案,他引用了这个标准。但这让我更加困惑,因为我可以区分 lvalues rvalues ,但 xvalues prvalues 仍然是新的我

天真地,在我看来,规则存在是有原因的,因此规避它的一些方法也可能[间接或直接]非法。

我有一些与左值演员有关的问题。用例包括以下内容。在第一种情况下,底层类型是不同的。在第二种情况下,限定符被更改。

*((int *) chrPtrValue) = some_integer_expression;

使用间接然后解除引用是否合法C和C ++规避左值投射错误?

如果演员表只更改限定符(即float f; *(static_cast<int*>(&f)) = 1; int ptr = ...; *(static_cast<volatile int*>(&ptr)) = NULL; staticconst),那么它在C和C ++中是否合法?

如果它的合法C和C ++,那么它是否违反了其他规则,如GCC的别名规则?

最后,如果它确实违反了C或C ++或其他规则,那么批准的方式是什么(可能是volatilememcpy)?

1 个答案:

答案 0 :(得分:1)

JoGusto的回答是:(a)不是很好,(b)关于C问题。

  

首先,合法的C和C ++是否绕过了左倾投射错误(间接然后解除引用)?

IDK你的意思是“规避左值投射错误”。代码(T)x = y;只是非法的废话(除了C ++中T是左值引用的情况,正如Joseph Mansfield的回答所述)。你没有规避它;你编写的代码具有合理的意义,并做你想做的事。

代码*(T *)ptr = y;编译。它意味着在T对象上调用赋值运算符,该对象存储在ptr的地址中。它与C ++中的(T &)*ptr = y;相同,即reinterpret_cast<T&>(*ptr) = y;

  

是否违反了其他规则,例如GCC的抗锯齿规则?

行为受到对齐和严格别名的影响。如果根据严格别名规则中的列表(实际上是T或{},实际上并没有存储在该地址的T对象,也没有与int兼容的类型的对象{1}}),然后它是未定义的行为。

  

那么批准的方式是什么(也许是memcpy或memmove)?

你可以写:

unsigned int
  

我通常可以区分左值和右值,而不是xvalues和prvalues。

在此示例中,您在识别哪些表达式时遇到了问题?