2017-04-02 104 views
0
#include<iostream> 

using namespace std; 

int* New() 
{ 
    return new int(666); 
} 
int Foo() 
{ 
    //method1: 
    int* it = New(); 
    return *it; 
    //method2: 
    return []() { return *(new int(666)); };//Complier has a complain here 
    /*Both New() and Lambda are callable object, are there any differences between method1 and method2?*/ 
} 
int main() 
{ 
    cout << Foo() << endl; 
    return 0; 
} 

我是C++新手,遇到上面的情況,我回顧了C++ Primer的章節10.3.2到10.3.3,其中介紹了lambda表達式。但它對我不起作用,我我也對我列出的最後一個註釋感到困惑。這個函數和lambda之間有什麼區別?

+1

你叫'新'。你沒有叫拉姆達。另外,C不是C++。 – user2357112

+0

另外,你泄漏了你分配的所有東西。 – user2357112

+0

這裏我的意思是如果我選擇方法,我將擦除方法1。你能給我更多的細節嗎? – Chase07

回答

2
return []() { return *(new int(666)); }; 

此行試圖返回lambda本身。你想呼叫拉姆達並返回整數,它產生:

return []() { return *(new int(666)); }(); // Note the() at the end 

有一般不定義lambda函數只是立即調用它,雖然遠點。當你需要實際返回一個函數或者將其作爲參數時,它們更常用。 (這是做的,但更先進的東西,所以你可能不應該擔心它現在。)


在一個單獨的說明:您的程序分配整數與new,但它永遠不會釋放他們delete。這是一個memory leak,這是你應該避免的。

+0

非常感謝,我只是在急速中寫下這個小實例,並且會更關注ur note。 – Chase07

0

實際上,我沒有給我的lambda打電話,因爲它缺少呼叫操作符。 因此,我將它修復爲:

return []() { return *(new int(666)); }(); 

它現在有效。

我回顧了C++ Primer 10.3.2章節中的單詞「我們稱之爲lambda,就像我們通過使用調用操作符稱呼函數一樣」。

相關問題