2012-08-17 65 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; 
}()); 
^^ 

我也改變了拉姆達的第二行到的東西,使一個比你的代碼更有意義。