微软 lvalue定义:
lvalue是指存在于单个表达式之外的对象。
第二定义:
表达式E属于
lvalue类别,当且仅当E指的实体已经具有身份(地址、名称或别名),使其可以在E之外访问。
我编写了以下代码:
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;
}f1()和f2()是lvalue表达式?lvalue reference到rvalue的地址是零?发布于 2017-12-23 23:31:43
因为每个函数都是对返回lvalue引用的函数的函数调用。
标准草案:[expr.call]
11如果结果类型是lvalue引用类型或.
为什么类型名称后面的&字符使其成为lvalue引用?
标准草案:[dcl.ref]
1在声明T中,D具有任一形式 &属性-说明符-seqopt D1 &和属性-说明符-seqopt D1 声明T D1中标识符的类型为“派生-声明器-类型列表T”,则D的标识符类型为“派生-声明-类型-列表引用T”. 2使用&声明的引用类型称为lvalue引用.
这种行为是不明确的。
标准草案:[expr.unary.op]
3单元组和操作符的结果是。结果具有“指向T的指针”类型,并且是指定对象的地址的prvalue。
没有指定的对象,在这种情况下,标准也没有定义运算符地址的行为。
标准草案:[defns.undefined]
本文档对其不施加任何要求的行为。 [ 注:当本文档忽略任何明确的行为定义时,可能会出现未定义的行为.
它们不一定是等同的。其中一个或两者都可能是不正确的。两者似乎都是对lvalue表达式的描述,而不是定义。
规范定义在C++标准文档中。
按照标准,lvalue的定义是什么?
标准草案:[basic.lval]
..。
[费用]部分定义了语言中的每个可能的表达式,如果表达式是一个lvalue,则说明这个表达式。"is a lvalue“发生了37次,但这种简单的搜索并不一定是详尽无遗的。
发布于 2017-12-23 23:15:36
最后返回挂起引用,因为返回的引用没有引用,因为A()在方法的末尾被销毁。你所拥有的是未定义的行为。0是一个占位符,因为它没有引用任何内存位置。f2()函数返回另一个临时变量作为引用。要绝对清楚,它们返回的内存位置是0,因为它们引用的内存位置不再退出。
希望这能有所帮助。
发布于 2017-12-23 23:53:06
使用lvalue引用返回类型声明一个函数意味着该函数调用是一个lvalue表达式(仅此而已)。
链接到的页面在将lvalue表达式等同于“已经存在”或“持久”或其他任何对象时都是错误的。在您的代码中,是一个lvalue表达式的示例,该表达式引用仅在函数调用期间存在的对象。
使用函数调用的结果会导致未定义的行为,因为lvalue表达式的行为只在它们实际引用对象时才定义。(加上引用正在构建或销毁的潜在对象的一些情况,但在这里不适用,因为在调用代码使用表达式的结果时,对象的关联存储已经释放)。
未定义的行为意味着任何事情都可能发生,包括(但不限于)输出零。
https://stackoverflow.com/questions/47956757
复制相似问题