繁体   English   中英

在C ++中,局部变量是否为右值?

[英]Are local variables rvalues in C++?

我正在读Stroustrup的一本教科书,以了解rvalue的概念并移动构造函数:

右值是-第一次近似-您不能分配的值,例如函数调用返回的整数,右值引用是对其他任何人都不能分配的值的引用。 Vector的operator +()中的res局部变量是一个示例。

上面引用的代码在下面列出。

问题:局部变量res可以合法出现在分配的左侧,例如res=nullptr 为什么将其视为右值?

Vector operator+(const Vector& a, const Vector& b) {

  if (a.size()!=b.size()) throw Vector_size_mismatch{};

  Vector res(a.size()); 

  for (int i=0; i!=a.size(); ++i) res[i]=a[i]+b[i]; 

  return res;

}

不,局部变量不是右值。 在您的示例中,右值是临时对象,它是函数返回的res副本(尽管可以省略对复制构造函数或move构造函数的调用)。

res本身是函数中的左值。

Vector的operator +()中的res局部变量是一个示例。

错了 res是左值的主要示例。 我有点担心你的教科书。 我们没有太多上下文,因此这可能只是拼写错误或措辞误导的一个例子。 但是,如果这是一个真正的错误,则表明作者对语言基本知识的严重缺乏。

通常的经验法则是:“如果它具有名称,则不能是右值。 即使在起初看上去似乎很混乱的情况下,它也能很好地工作。 例如:

// A temporary has no name.
// Therefore: Can call foo() with it.
foo(Object());

void foo(Object&& o)
{
    // o has a name. Therefore: not an rvalue.
    // Therefore: Must move.
    bar(std::move(o));
}

void bar(Object&& o)
{
    // ...
}

该规则在代码段中的任何地方都适用:

  • 所有.size()返回值:无名称-> rvalue
  • abresi有名字->不是右值
  • i!=a.size()布尔值:无名称-> rvalue
  • a[i]+b[i]临时:无名称-> rvalue

仅函数的返回值比较棘手,因为返回值优化(RVO)在这里起作用。 这里的经验法则是:“如果返回局部变量,通常不需要std :: move()。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM