检查一个 std::function 是否被赋值为 nullptr

6

我想知道有没有办法检查你分配给std::function的函数指针是否为nullptr。我原以为!运算符可以做到,但它似乎只在将函数分配为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;
    }
}

你的意思是“分配了一个nullptr_t类型的东西”,对吧?当我第一次看到答案时,我以为你在区分初始化和赋值,但现在我看到不是这样。 - Ben Voigt
2
请避免在示例中使用诸如__cdeclHWND之类的非可移植代码,因为您的问题并不依赖于任何特定于Windows的内容,所以没有理由不使用函数类型,例如void(),这可以在任何平台上被任何人测试。 - Jonathan Wakely
我移除了Windows特定的部分,并将其更改为“type nullptr_t”。 - Erik Welander
1个回答

8

这是你的std::function实现中的一个bug(我的实现也有这个问题),标准规定,如果对象使用空函数指针构造,则operator!应返回true,详见[func.wrap.func]第8段。赋值运算符应等同于使用参数构造一个std::function并交换它,因此在这种情况下,operator!也应返回true。


这不是一个 explicit operator bool() 吗? - dyp
1
@DyP:而 ! 会导致上下文转换为布尔值,从而调用显式运算符。 - Ben Voigt
@DyPпјҢжҲ‘жҢҮзҡ„жҳҜжөӢиҜ•з”ЁдҫӢдёӯдҪҝз”Ёзҡ„е…ЁеұҖoperator!пјҢиҖҢдёҚжҳҜstd::function :: operator!пјҲиҜҘж“ҚдҪңз¬ҰдёҚеӯҳеңЁпјүгҖӮ - Jonathan Wakely
10
显然有人名叫Jonathan Wakely将此视为libstdc++的漏洞,并表示他们将修复它:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57465 -- 噢。 - Jonathan Wakely
1
@Xeo,G++拒绝为const T*推导函数类型,因为您不能有一个带有const限定符的函数,解决方法允许推导成功,因为它不再需要形成一个带有const限定符的函数类型。正确的行为并不清楚,请参见核心问题[1584](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584)和[503](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#503)。 - Jonathan Wakely
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接