2016-11-20 37 views

回答

5

但是從語言的角度來看會發生什麼?我們以某種方式分配函數的返回值?

是的,這可以是有效的,這取決於函數的返回類型。主要有兩種方法可以有效:首先,該函數可以返回一個對象的左值引用。

int i; 
int &f() { return i; } 
int main() { f() = 1; } // okay, assigns to i 

其次,功能可與=符實現,可以在右值被稱爲返回用戶定義類型:

struct S { void operator=(int) { } }; 
S f() { return {}; } 
int main() { f() = 1; } // okay, calls S::operator= 

後者是做什麼用std::tie發生。

+0

請注意,對於C++'struct'和'class'es,直到右值引用'* this'出現在C++ 11中,即使是暫時的!即使結果被丟棄,「operator =」也可以工作。這裏有趣的部分是,分配給'tie'確實有用*。 – Yakk

2

tie返回引用的元組。您正在分配給該元組,這意味着元組成員分配(除std::ignore d字段外)。由於該元組的元素實際上是引用,因此您將分配給綁定的元素。

4

std::tie(myint, std::ignore, mychar)返回類型是
std::tuple<int&, decltype((std::ignore)), char&>,其中所述int&myint基準和char&mychar的參考。

mytuple被分配給這個返回的元組引用時,mytuple中的每個值都被分配給存儲在返回元組中的相應引用。這具有更新myintmychar的效果。

std::tie(myint, std::ignore, mychar)    // <-- expression 
std::tuple<int&, decltype((std::ignore)), char&> // <-- type 

std::tie(myint, std::ignore, mychar)    = mytuple; 
std::tuple<int&, decltype((std::ignore)), char&> = std::tuple<int, T, char>&; 
// functions as 
      std::tuple<int , T      , char >& 
//   ↓↓   =  =      = ↓↓ 
      std::tuple<int&, decltype((std::ignore)), char&> 

// end result: 
myint = std::get<0>(mytuple); 
mychar = std::get<2>(mytuple); 
int& = int&; 
char& = char&; 
+0

'decltype(std :: ignore)&'(或'decltype((std :: ignore))')。 。 –

+0

@ T.C。 : 確實!謝謝。 – ildjarn

1

從CPP參考「創建左值引用的元組的參數或性病的情況::忽視。」

在這個意義上,它不是從您指定的返回值是不同的操作符[]在

vec[3]=5; 

我們只需要提及的是C++ 17已經構建綁定auto [a,b,c] =std::ignore with structured bindings?

+0

但是,那基本上是一個賦值給'右值',對吧? (在C++中不禁止) – Michael

+0

@Michael綁定的元組確實是一個右值 – krzaq