【问题标题】:C++ object assignment to NULLC++ 对象赋值为 NULL
【发布时间】:2011-02-17 14:46:54
【问题描述】:

我正在查看一些使用 Boost.Function 的代码,并且对如何编写代码以允许赋值为 NULL 有疑问。我试图追踪相应的 Boost 代码,但无法找到。基本上,是什么让这成为可能?

boost::function<void()> func;
func = NULL;

编辑:以下内容不适合我,那么他们如何防止这种情况呢?

func = 1;

【问题讨论】:

  • 如果您的问题是关于底层实现,那么您需要记住function 是一个多态对象,它保持指向实际函数(对象)的指针。该指针自然可以为空。
  • @Gene,我想我的问题更具体地说是关于实现对 NULL 的赋值,而不是 boost::function 背后的语义。不过你说的很有道理,谢谢。

标签: c++ boost null


【解决方案1】:

通过带有指针参数的运算符重载。来自提升来源:

#ifndef BOOST_NO_SFINAE
   self_type& operator=(clear_type*)
   {
     this->clear();
     return *this;
   }
#endif

这并不意味着“func”本身就是NULL,实际上你可以访问它自己的函数。以下代码可以编译并且不会崩溃。

TEST_F(CppTest, BoostFunctions) {
    boost::function<void()> func;
    func = NULL;
    ASSERT_TRUE(func==NULL);
    ASSERT_FALSE(func.has_trivial_copy_and_destroy());
}

【讨论】:

  • 这也是阻止func = 1的机制,你知道吗?
  • @JaredC:是的。 NULL、0 和其他空指针常量可以转换为 clear_type*,但 1 不能。
  • 完美,谢谢。这似乎也暗示这个“技巧”只适用于表示指针的对象,或者对指针的赋值是明确定义的。我想这在您希望 obj = NULL 调用 obj.reset() 或类似的更一般的情况下不起作用,嗯?
  • @JaredC:只有当obj 是支持这种成语的类的实例时,它才有效。 boost::shared_ptr&lt;T&gt; 是另一个例子。
【解决方案2】:

我不知道你到底想做什么,但这可能会有所帮助:

boost::function<void()> *pFunc;
pFunc = NULL;

顺便说一句,在 C++ 中,您通常写 0 或 nullptr 而不是 NULL。

【讨论】:

【解决方案3】:

boost::function 可以在其赋值运算符中接受指向函数的指针。指针可以是有效指针或NULL(意思是0)。尝试传递 int 时出现错误的原因是您无法将整数分配给指针。这就像尝试执行以下操作:

char* c = 1;

也不会编译。

【讨论】:

    【解决方案4】:

    如您所见in the documentation std::function 有一个来自nullptr_t 的赋值运算符

    【讨论】:

    • 这看起来是 VC++ 特有的,你知道那是不是可移植的 C++?我正在使用 linux 和 boost。
    • @JaredC -- 它不是 VC++ 特定的,它是 C++0x 特定的。
    • 我的错。不过,我目前没有使用 C++0x。不过我会记住这一点。
    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 2017-11-07
    • 2013-11-24
    • 2013-12-07
    • 2014-03-24
    • 2012-11-16
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多