2014-01-23 24 views
0

我看到這一點:什麼函數可以應用於右值?

std::tie(iter, inserted) = set_of_s.insert(value); 

http://en.cppreference.com/w/cpp/utility/tuple/tie

std::tie應返回一個右值的元組,但隨後一個賦值操作符適用於它。這是如何工作的?我以爲賦值運算符只能用於左值?

+1

定義'std :: tie'返回一個定義了'operator =()'的對象(甚至沒有引用它)。那個操作符被調用。照常。你在哪裏看到這個問題? –

+0

@ c-smile我真的很困惑cuz opetator =()返回一個左值引用和theres沒有lvaue任何地方它會返回... – texasbruce

+0

你的任務就是這樣: '{std :: tie temp( iter,插入); temp.operator =(set_of_s。插入(值)); }'。如你所見,它只是一個臨時對象的函數調用, –

回答

2

什麼函數可以應用於右值?

一種右值可以是

  • 作爲this參數的成員函數
  • 的由值
  • 通過const左值參考
  • 通過右值通過通過通過通過參考。

它不能通過非const 左值參考。

這是如何工作的?

重載的賦值運算符是一個構件的功能,所以可以在一個右值被調用。

我以爲賦值運算符只能用於左值嗎?

這就是內置賦值運算符的情況。重載操作符是函數,並遵循與函數相同的規則。

2

是的,內置的=運算符必須有一個左值作爲其左操作數。但是,這不是內置的=運營商,就像它看起來一樣。相反,它是在功能operator=打電話,相當於:

std::tie(iter, inserted).operator=(set_of_s.insert(value)); 

類成員訪問運算.不需要它的左操作數是一個左值,所以一切都還好。

備註:不要混淆表達式的值類別與左值/右值引用類型。賦值運算符可能非常有右值引用的名稱作爲其左操作數,因爲它的名稱是一個左值。

+2

這是根據定義*該類型的*'='運算符。它只是這種類型的成員,這是什麼使這種使用。 –

+0

@DavidRodríguez-dribeas是的,不好的措辭,我應該解決它。 –

+0

但賦值運算符返回一個左值引用。左值從哪裏來? – texasbruce

相關問題