6

に割り当てた関数ポインタstd::functionnullptr. !-operator がそれを行うことを期待していましたが、関数に type の何かが割り当てられている場合にのみ機能するようですnullptr_t

typedef int (* initModuleProc)(int);

initModuleProc pProc = nullptr;
std::function<int (int)> m_pInit;

m_pInit = pProc;
std::cout << !pProc << std::endl;   // True
std::cout << !m_pInit << std::endl; // False, even though it's clearly assigned a nullptr
m_pInit = nullptr;
std::cout << !m_pInit << std::endl; // True

今のところ、これを回避するためにこのヘルパー関数を作成しました。

template<typename T>
void AssignToFunction(std::function<T> &func, T* value)
{
    if (value == nullptr)
    {
        func = nullptr;
    }
    else
    {
        func = value;
    }
}
4

1 に答える 1

8

それはあなたのstd::function実装のバグです(そして明らかに私のものでも)、operator!オブジェクトがnull関数ポインターで構築された場合、標準はtrueを返すと言っています。[func.wrap.func]パラグラフ8を参照してください。代入演算子は次と同等でなければなりません引数を使用してa を構築しstd::function、それを交換するため、operator!その場合も true を返す必要があります。

于 2013-08-05T19:26:23.883 に答える