C++ C++;0x和lambdas

C++ C++;0x和lambdas,c++,lambda,c++11,C++,Lambda,C++11,查看此模板: template <class T> auto checkErrorCode(T& functor) -> decltype(functor()) { auto retCode = functor(); // ... additional aspect-like stuff with retCode here return retCode; } …当我使用内联lambda直接调用“checkErrorCode”时,它不会编译,并发

查看此模板:

template <class T>
auto checkErrorCode(T& functor) -> decltype(functor()) {
    auto retCode = functor();
    // ... additional aspect-like stuff with retCode here
    return retCode;
}
…当我使用内联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()::<lambda()>)'
forSO.cpp:24:5: note: candidate is:
forSO.cpp:2:6: note: decltype (functor()) checkErrorCode(T&) [with T = main()::<lambda()>, decltype (functor()) = int]
forSO.cpp:2:6: note:   no known conversion for argument 1 from 'main()::<lambda()>' to 'main()::<lambda()>&'

模板需要使用右值引用:

template <class T>
auto checkErrorCode(T&& functor) -> decltype(functor()) {
    auto retCode = functor();
    // ... additional aspect-like stuff with retCode here
    return retCode;
}
模板
自动检查错误代码(T&&functor)->decltype(functor()){
auto retCode=函子();
//…其他方面,如retCode
返回代码;
}
或者,常量左值(
const T&
)。因为lambda是临时(右值)函数,所以只能通过常量(左值)引用或右值引用传递它们

通常,除非您计划进行非常量访问(例如赋值的左侧、非常量成员函数的调用等),否则请保持左值引用为常量
如果你在做continuations,它可能会变得更复杂,因为你必须传递一个非常量左值引用。但您将有一个显式函子类,因此允许创建非常量左值ref。在本例中,对lambdas使用右值引用更为清晰,因为const-lvalue-ref是C++98的工作方式,该系统的限制是创建右值引用的一个激励因素。

事实上,我只是尝试更改为“const-T&funcor”,结果成功了。谢谢。@ttsiodras:您应该使用
T&&functor
而不是常量引用,否则将无法使用非常量
运算符()传入函子。
@ildjarn值得注意的是,
&
由于引用崩溃而应用于模板参数类型时具有特殊意义。在这些情况下,它不一定意味着r值参考,而是保留论点的“价值”。这是实现完美转发所必需的。@MichaelPrice:事实上,这就是我在这里的观点——它允许传递右值和左值,同时允许非常量
operator()
s:-]
bash$ g++ -v
...
gcc version 4.6.2 (GCC) 
template <class T>
auto checkErrorCode(T&& functor) -> decltype(functor()) {
    auto retCode = functor();
    // ... additional aspect-like stuff with retCode here
    return retCode;
}