C++对象赋值为NULL

5
我正在查看使用Boost.Function的一些代码,并且对于如何编写允许赋值为NULL的代码有疑问。我尝试查找相应的Boost代码,但未能成功。基本上,是什么使这成为可能?
boost::function<void()> func;
func = NULL;

编辑:以下代码在我的电脑上无法编译,那么他们又是如何防止这种情况的呢?
func = 1;

如果你的问题涉及底层实现,那么你需要记住 function 是一个多态对象,它保留了指向实际函数(对象)的指针。该指针自然可以为空。 - Gene Bushuyev
@Gene,我想我的问题更具体地是关于一般情况下实现将赋值为NULL,而不是boost::function背后的语义。你说的很有道理,谢谢。 - JaredC
4个回答

3

通过使用指针参数进行运算符重载。来自boost源代码:

#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
@JaredC:是的。NULL、0和其他空指针常量可以转换为clear_type*,但1不能。 - Fred Nurk
太好了,谢谢。这也意味着这个“技巧”只适用于表示指针的对象,或者在指针赋值被明确定义的情况下。我猜在更一般的情况下,当你想要obj = NULL调用obj.reset()或类似方法时,这个方法不会起作用,对吗? - JaredC
@JaredC:仅当 obj 是支持这种用法的类的实例时才有效。boost::shared_ptr<T> 是另一个例子。 - MSalters

1

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

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

顺便提一下,在C++中,你大多数情况下会写0或nullptr而不是NULL。

4
除非你可能永远不想动态创建函数对象。 - Gene Bushuyev
你误解了。我不认为 OP 想要一个指向 boost::function 的指针。请参见 https://dev59.com/Z1TTa4cB1Zd3GeqPsGuf#5030666 - Fred Nurk

1

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

char* c = 1;

这个也无法编译。


0

正如您可以在文档中看到的那样,std::function有一个从nullptr_t的赋值运算符。


那看起来是VC++特定的,你知道它是否是可移植的C++吗?我正在使用Linux和Boost。 - JaredC
1
@JaredC -- 这不是VC++特定的,而是C++0x特定的。 - Gene Bushuyev
我的错。我目前还没有使用 C++0x。但我会记住这个的。 - JaredC

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