断言内的Lambda

时间:2012-08-17 17:30:49

标签: c++ lambda assert

assert()的调用中是否可以使用lambda?

当我尝试以下内容时......

assert([&]() -> bool{
        sockaddr_storage addr; int addrlen = sizeof(addr);
        return (getsockname(this->m_Socket, (sockaddr*)&addr, &addrlen) != 0) ? false : true;
    });

...我收到错误

  

错误C2675:一元'!' :'`anonymous-namespace'::'没有定义此运算符或转换为可接受的类型   预定义运算符

2 个答案:

答案 0 :(得分:8)

当然,但断言真的只需要一个布尔值;不是lambda,所以你必须自己调用它(假设你的lambda是一个返回你想要断言的东西):

assert(([&]() -> bool{
        sockaddr_storage addr; int addrlen = sizeof(addr);
        return getsockname(this->m_Socket, (sockaddr*)&addr, &addrlen) == 0;
    })());

答案 1 :(得分:2)

你不能断言lambda本身是“真的”,因为lambdas没有真实性的概念。

如果要调用lambda并声明其返回值为true,则需要调用它:

assert([&]() -> bool{
    sockaddr_storage addr; int addrlen = sizeof(addr);
    return getsockname(this->m_Socket, (sockaddr*)&addr, &addrlen) == 0;
}());
 ^^

我还将lambda的第二行改为比你的代码更有意义的东西。