2017-09-26 68 views
4

我有一些麻煩從lambda返回引用。 此代碼的工作:C++ 11 lambda返回引用

std::function<int*(int*)> funct; 

funct = [](int *i){ 
    ++*i; 
    return i; 
}; 

int j = 0; 
LOG<<*funct(&j)<<j; 

輸出:1

但不是這一個:

std::function<int&(int&)> funct; 

funct = [](int &i){ 
    ++i; 
    return i; 
}; 

int j = 0; 
LOG<<funct(j)<<j; 

大樓錯誤:C:\ Program Files文件(x86)的\微軟的Visual Studio 14.0 \ VC \ include \ type_traits:1441:error:C2440:'return':無法從'int'轉換爲'int &'

任何想法爲什麼?對我而言,這是一回事。

+0

請提供[MCVE]。你目前的一個不能編譯。 – tambre

+0

你爲什麼要把它作爲參考返回?應該解決什麼問題?爲什麼不簡單地按值返回(這是lambda已經做的)? –

+0

@Someprogrammerdude因爲它通過參數獲取它作爲參考。例如鏈式'std :: ostream :: operator <<'調用。 – Slava

回答

18

該lambda推導返回類型,就像指定auto一樣。 auto ret = i;將推斷retint

一種解決方案是明確的陳述拉姆達的返回類型:

funct = [](int &i) -> int& { 
    ++i; 
    return i; 
}; 

正如意見中提到的另一種方式是

funct = [](int &i) -> decltype(auto) { 
    ++i; 
    return i; 
}; 

它實際上告訴編譯器不要做任何扣除和只需使用該類型就好像decltype已用於返回表達式。

如果您對確切規則檢查感到好奇the documentation其中還有auto部分和decltype(auto)位。

+0

或者使用'decltype(auto)'作爲返回類型!這與'auto'的使用形成鮮明對比。也就是說,'decltype(auto)ret = i;'使'ret'作爲對'i'的引用。 – Nawaz

+0

和人們說C++具有模糊,複雜的語法。他們知道什麼:-) – pm100