是分配内存rvalue表达式还是左值表达式的表达式?

pok*_*che 10 c++

假设我有以下代码

int main(){
    new int; // Is this expression l-value or r-value??

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

我知道左值是持久对象(因为它在内存中具有特定的位置,即使在表达式结束后我们也可以访问后者)并且rvalues是临时对象(它在内存中没有位置并且在表达式结束后蒸发).

我看到了一些rvalue表达式.如果表达式返回一个地址(内存中的特定位置),它怎么能是rvalue.或者它是否是rvalue因为表达式new int返回(地址值),它会消失,并且在表达式结束后永远不会被捕获.

R S*_*ahu 14

new int 是一个r值.

你不能使用:

int i;
(new int) = &i;
Run Code Online (Sandbox Code Playgroud)

也许您正在考虑其地址返回的对象new int.表示返回其地址的对象的表达式*(new int)是l值.您可以使用:

*(new int) = 10;
Run Code Online (Sandbox Code Playgroud)

那不是好代码.它会泄漏内存,但它是合法代码.

  • "返回地址的对象是l值." 对象没有值类别.*表达式*具有值类别. (6认同)
  • 如果我理解正确的话,它是C++ 11之前的r值和C++ 11之后的pr值,对吧? (5认同)
  • @pokche,`*x`不是*任何*转换的`x`,它是一个解除引用.您可能会想到在`int*x = new int;`这样的事情中完成转换 - 而`new int`本身可能会渲染一个右值,`x`是一个左值(或其某些变体). (2认同)