【问题标题】:Checking if an std::function is assigned to a nullptr检查是否将 std::function 分配给 nullptr
【发布时间】:2013-08-05 19:19:16
【问题描述】:

我想知道是否有任何方法可以检查您分配给std::function 的函数指针是否为nullptr。我期待 !-operator 能够做到这一点,但它似乎只在函数被分配了 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 类型的东西”,对吗?当我第一次阅读答案时,我以为你在区分初始化和赋值,但现在我看到了。
  • 请避免在示例中使用像__cdeclHWND 这样的非便携式废话,您的问题不依赖于任何Windows 特定的东西,因此没有理由不使用诸如@ 之类的函数类型987654330@,任何人都可以在任何平台上测试。
  • 我删除了 Windows 特定的部分,并将其更改为“type nullptr_t”

标签: c++ c++11 std std-function nullptr


【解决方案1】:

这是你的std::function 实现中的一个错误(显然也是我的),标准规定如果对象是用空函数指针构造的,operator! 应返回 true,请参阅 [func.wrap.func] 段8. 赋值运算符应该等价于用参数构造一个std::function 并交换它,所以operator! 在这种情况下也应该返回true。

【讨论】:

  • 不是explicit operator bool()吗?
  • @DyP:而! 会导致上下文转换为 bool,从而调用显式运算符。
  • @DyP,我指的是在测试用例中使用的全局 operator!,而不是 std::function::operator!(它不存在。)
  • 显然有人叫 Jonathan Wakely 将此报告为 libstdc++ 中的一个错误,并表示他们将修复它:gcc.gnu.org/bugzilla/show_bug.cgi?id=57465 -- 糟糕。
  • @Xeo,G++ 拒绝为const T* 推导函数类型,因为你不能有一个 const 限定的函数,解决方法允许推导成功,因为它不再需要形成一个 const-合格的函数类型。正确的行为不清楚,请参阅核心问题1584503
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多