3

への呼び出し内でラムダを使用することは何とか可能assert()ですか?

次のことを試してみると...

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

...エラーが発生します

エラー C2675: 単項 '!' : '`anonymous-namespace'::' は、この演算子または事前定義された演算子に受け入れられる型への変換を定義していません

4

2 に答える 2

10

もちろんですが、assertは実際にはブール値のみを必要とします。ラムダではないので、自分で呼び出す必要があります(これは、ラムダがアサートしたいものを返すものであると想定しています)。

assert(([&]() -> bool{
        sockaddr_storage addr; int addrlen = sizeof(addr);
        return getsockname(this->m_Socket, (sockaddr*)&addr, &addrlen) == 0;
    })());
于 2012-08-17T17:33:03.353 に答える
3

ラムダには真実性の概念がないため、ラムダ自体が「真」であると断言することはできません。

ラムダを呼び出して、その戻り値が true であることをアサートする場合は、それを呼び出す必要があります。

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

また、ラムダの 2 行目を、コードよりも少し意味のあるものに変更しました。

于 2012-08-17T17:35:46.373 に答える