2013-06-04 56 views
4

我是C++中的新手。我只是嘗試了幾個小的代碼片段來理解使用GCC 4.6.3編譯的lambda函數-std=c++0x。我知道它不是C++ 0x的最佳選擇,但它支持lambda表達式。 我已經寫了這個:爲什麼C++中的Lambda函數0x返回類型必須是auto?

int main(){ 
    int val1 = 0, val2 = 0; 
    std::cout << "Enter Value1" << '\n'; 
    std::cin >> val1; 
    std::cout << "Enter Value2" << '\n'; 
    std::cin >> val2; 
    auto result = [&val1, &val2](){return (val1 + val2);}; 
    std::cout << "Result: " << [](int x, int y){return(x + y);}(32, 46) << '\n'; 
    //std::cout << "Result: " << [&val1, &val2](){return (val1 + val2) ;} << '\n'; 
    return 0; 
} 

我的第一個問題是,爲什麼我一定要定義resultauto時,我已經知道了預期(隱含的)結果將是int? 在註釋的代碼行中,我收到錯誤error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’。 你能告訴我爲什麼發生了嗎? 在此先感謝。

回答

9

你似乎對函數的結果和函數本身感到困惑。在此行中

auto result = [&val1, &val2](){return (val1 + val2);}; 

要創建一個lambda函數(在=的右側),並將其分配給一個名爲result變量。 auto有用於保存lambda函數的變量的類型,而不是lambda函數的返回類型。

如果你想使返回類型是明確的,它會做這樣的:

auto result = [&val1, &val2]() -> int {return (val1 + val2);}; 

如果你想使result類型更加明確,可以使用std::function

std::function<int()> result = [&val1, &val2]() {return (val1 + val2);}; 

而且,由於result是一個功能,你可以使用result這樣的:

std::cout << result() << "\n"; 
+0

我懷疑這個lambda表達式是類似Python中的一行函數,所以不會導致應該返回變量&汽車應該說像返回類型是一些(void *)?這就像調用result = func(int x,int y); func的定義是int func(int,int); ??另外std :: function是一個使事情變得複雜的包裝,你不這麼認爲嗎? –

+0

爲增加關於lambda表達式的信息的投票權。 :) –

+0

@AshankPanwar:Lambdas就像無名的函數,但你似乎在函數的結果和函數本身之間感到困惑。 –

4

在您的示例中,result是一個函數(請注意,您不執行匿名函數)。在該行

std::cout << "Result: " << [&val1, &val2](){return (val1 + val2) ;} << '\n'; 

你正試圖輸出一個函數,而不是應用函數的結果。將其更改爲

std::cout << "Result: " << [&val1, &val2](){return (val1 + val2) ;}() << '\n'; 

,並打印出的val1val2的總和。

+0

它不是一個函數指針,它是由lambda表達式創建的閉包類型的一個實例。 –

+0

噢好吧,所以我只是返回的定義,但爲了調用這個匿名函數,我需要輸入括號。謝謝.. :) –

相關問題