簡體   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