一千萬個為什麽

搜索

C ++ 0x和lambdas

看看這個模板:

template 
auto checkErrorCode(T& functor) -> decltype(functor()) {
    auto retCode = functor();
   //... additional aspect-like stuff with retCode here
    return retCode;
}

它應該執行在其中傳遞的lambda, 從lambda獲取返回值,用它做一些事情, 然後將其返回給調用者。想想“方面編程”, 記錄,無論如何。

即使它編譯並正常工作......

int foo(int param)
{
    return param>10?0:-1;
}

main()
{
    int param = 11;

   //This compiles fine
    auto action = [&](){ return foo(param); };
    checkErrorCode( action );
}

...它沒有編譯 - 並且發出一個難以理解的錯誤 - 當我直接使用內聯lambda調用“checkErrorCode”時:

int foo(int param)
{
    return param>10?0:-1;
}

main()
{
    int param = 11;

   //This doesn't compile...
    checkErrorCode( [&](){ return foo(param); } );
}

有什麽想法為什麽?

g ++發出這個奇怪的錯誤:

forSO.cpp: In function 'int main()':
forSO.cpp:24:5: error: no matching function for call to 'checkErrorCode(main()::)'
forSO.cpp:24:5: note: candidate is:
forSO.cpp:2:6: note: decltype (functor()) checkErrorCode(T&) [with T = main()::, decltype (functor()) = int]
forSO.cpp:2:6: note:   no known conversion for argument 1 from 'main()::' to 'main()::&'

在不太可能的情況下,這是一個編譯器錯誤:

bash$ g++ -v
...
gcc version 4.6.2 (GCC) 

最佳答案

模板需要使用右值引用:

template 
auto checkErrorCode(T&& functor) -> decltype(functor()) {
    auto retCode = functor();
   //... additional aspect-like stuff with retCode here
    return retCode;
}

Or, const lvalue (const T&). Because lambdas are temporary (rvalue) functions, you can only pass them by const (lvalue) reference or by rvalue reference.

通常,保持左值引用const,除非您計劃進行非常量訪問(例如,賦值的左側,非常量成員函數的調用等) 如果你正在繼續,它會變得有點復雜,因為那時你必須傳遞一個非const左值引用。但是你有一個顯式的仿函數類,因此允許非const lvalue ref創建。在這種情況下,使用rvalue ref為lambdas更清楚,因為const lvalue ref是C ++ 98的處理方式,並且該系統的限制是創建rvalue引用的激勵因素。

轉載註明原文: C ++ 0x和lambdas