首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个lvalue等价定义

多个lvalue等价定义
EN

Stack Overflow用户
提问于 2017-12-23 23:07:22
回答 3查看 96关注 0票数 1

微软 lvalue定义:

lvalue是指存在于单个表达式之外的对象。

第二定义:

表达式E属于lvalue类别,当且仅当E指的实体已经具有身份(地址、名称或别名),使其可以在E之外访问。

我编写了以下代码:

代码语言:javascript
复制
class A{};

const A& f1()
{
    return A();
}

const int& f2()
{
    return 1;
}

int main() {
    cout<<&f1()<<endl; // this prints everytime "0".
    cout<<&f2()<<endl; // this prints everytime "0".
    return 0;
}
  1. 为什么f1()f2()lvalue表达式?
  2. 为什么lvalue referencervalue的地址是零?
  3. 为什么这两个定义是等同的?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-23 23:31:43

  1. 为什么f1()和f2()是lvalue表达式?

因为每个函数都是对返回lvalue引用的函数的函数调用。

标准草案:[expr.call]

11如果结果类型是lvalue引用类型或.

为什么类型名称后面的&字符使其成为lvalue引用?

标准草案:[dcl.ref]

1在声明T中,D具有任一形式 &属性-说明符-seqopt D1 &和属性-说明符-seqopt D1 声明T D1中标识符的类型为“派生-声明器-类型列表T”,则D的标识符类型为“派生-声明-类型-列表引用T”. 2使用&声明的引用类型称为lvalue引用.

  1. 为什么对rvalue的lvalue引用地址为零?

这种行为是不明确的。

标准草案:[expr.unary.op]

3单元组和操作符的结果是。结果具有“指向T的指针”类型,并且是指定对象的地址的prvalue。

没有指定的对象,在这种情况下,标准也没有定义运算符地址的行为。

标准草案:[defns.undefined]

本文档对其不施加任何要求的行为。 [ 注:当本文档忽略任何明确的行为定义时,可能会出现未定义的行为.

  1. 为什么这两个定义是等同的?

它们不一定是等同的。其中一个或两者都可能是不正确的。两者似乎都是对lvalue表达式的描述,而不是定义。

规范定义在C++标准文档中。

按照标准,lvalue的定义是什么?

标准草案:[basic.lval]

  • (1.1) glvalue是一种表达式,其计算值确定对象、位字段或函数的身份。

..。

  • (1.3) xvalue是一个glvalue,表示一个对象或位字段,其资源可以重用(通常是因为它的生命周期已接近尾声)。[dcl.ref示例:涉及rvalue引用( )的某些表达式产生rvalue,例如对其返回类型为rvalue引用或对rvalue引用类型的转换的函数的调用。- end示例 ]
  • (1.4) lvalue是一个不是x值的极值。

[费用]部分定义了语言中的每个可能的表达式,如果表达式是一个lvalue,则说明这个表达式。"is a lvalue“发生了37次,但这种简单的搜索并不一定是详尽无遗的。

票数 3
EN

Stack Overflow用户

发布于 2017-12-23 23:15:36

最后返回挂起引用,因为返回的引用没有引用,因为A()在方法的末尾被销毁。你所拥有的是未定义的行为。0是一个占位符,因为它没有引用任何内存位置。f2()函数返回另一个临时变量作为引用。要绝对清楚,它们返回的内存位置是0,因为它们引用的内存位置不再退出。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-12-23 23:53:06

使用lvalue引用返回类型声明一个函数意味着该函数调用是一个lvalue表达式(仅此而已)。

链接到的页面在将lvalue表达式等同于“已经存在”或“持久”或其他任何对象时都是错误的。在您的代码中,是一个lvalue表达式的示例,该表达式引用仅在函数调用期间存在的对象。

使用函数调用的结果会导致未定义的行为,因为lvalue表达式的行为只在它们实际引用对象时才定义。(加上引用正在构建或销毁的潜在对象的一些情况,但在这里不适用,因为在调用代码使用表达式的结果时,对象的关联存储已经释放)。

未定义的行为意味着任何事情都可能发生,包括(但不限于)输出零。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47956757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档