Присвоение объекта C ++ NULL - PullRequest
       3

Присвоение объекта C ++ NULL

5 голосов
/ 17 февраля 2011

Я просматривал некоторый код, который использует Boost.Function и у меня возник вопрос о том, как можно написать код, позволяющий присваивать значение NULL. Я пытался отследить соответствующий Boost-код, но не смог. В принципе, что делает это возможным?

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

РЕДАКТИРОВАТЬ: Следующее не компилируется для меня, так как они тоже это предотвращают?

func = 1;

Ответы [ 4 ]

3 голосов
/ 17 февраля 2011

Перегрузкой оператора параметром указателя. Из источников повышения:

#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());
}
1 голос
/ 17 февраля 2011

boost::function может принять указатель на функцию в своем операторе присваивания. Указатель может быть допустимым указателем или NULL (что означает 0). Причина, по которой вы получаете ошибку при попытке передать int, заключается в том, что вы не можете назначить целое число указателю. Это все равно что пытаться сделать следующее:

char* c = 1;

Что тоже не скомпилируется.

1 голос
/ 17 февраля 2011

Я не знаю, что именно вы пытаетесь сделать, но это может помочь:

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

Кстати, в C ++ вы в основном пишете 0 или nullptr вместо NULL.

0 голосов
/ 17 февраля 2011

Как вы можете видеть в документации std :: function имеет оператор присваивания от nullptr_t

...