2012-08-17 63 views
1

是否有可能在调用assert()时使用lambda?lambda内部声明

当我尝试以下方法...

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

...我得到的错误

错误C2675:一元 '!' :“`匿名命名空间” ::”没有定义此运算符或转换到类型接受的 预先规定的操作

+0

当然,但为什么?为什么不只是做你的工作,然后检查它? – Caesar 2012-08-17 17:34:29

+0

您是否尝试过static_assert? – galadog 2012-08-17 17:34:37

+1

@galadog:如何解决它?这是编译时。 – GManNickG 2012-08-17 17:35:12

回答

8

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

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

啊好吧,lambda对我来说是新的...没想到它... 非常感谢你! – Incubbus 2012-08-17 17:34:20

+0

@Incubbus:注意新添加的return语句。 – GManNickG 2012-08-17 17:36:07

2

不能断言拉姆达本身就是“真” ,因为lambdas没有真理的概念。

如果你要调用的Lambda和断言,它的返回值是真实的,那么你需要调用它:

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

我也改变了拉姆达的第二行到的东西,使一个比你的代码更有意义。