Почему Boost.Concept вызывает деструкторы через нулевые указатели?

При анализе некоторого Boost-зависимого кода через статический анализатор Clang я получил следующую ошибку:

Логическая ошибка Вызванный указатель на объект C ++ — пустое использование.hpp 22

из следующего кода в boost/concept/usage.hpp

template <class Model>
struct usage_requirements
{
~usage_requirements() { ((Model*)0)->~Model(); }
};

Вопрос: это реальная ошибка в Boost или Boost.Concept вызывает деструктор через нулевой указатель, чтобы каким-то образом генерировать ошибки компилятора во время проверки концепции?

2

Решение

* Отказ от ответственности. Возьми это с солью, я ни в коем случае не эксперт по Boost Concept.

Он использовался для того, чтобы заставить компилятор создавать деструктор «Модель», чтобы компилятор генерировал ошибки для концептуальных сбоев.

usage_requirements используется вместе с BOOST_CONCEPT_USAGE который используется при создании новых концепций, см. Создание концепций в документации.

#   define BOOST_CONCEPT_USAGE(model)                                    \
model(); /* at least 2.96 and 3.4.3 both need this :( */           \
BOOST_CONCEPT_ASSERT((boost::concepts::usage_requirements<model>)); \
~model()

Который используется как:

BOOST_CONCEPT_USAGE(InputIterator)
{
X j(i);             // require copy construction
same_type(*i++,v);  // require postincrement-dereference returning value_type
X& x = ++j;         // require preincrement returning X&
}

Что в конечном итоге, как:

model(); /* at least 2.96 and 3.4.3 both need this :( */           \
BOOST_CONCEPT_ASSERT((boost::concepts::usage_requirements<model>)); \
~model()
{
X j(i);             // require copy construction
same_type(*i++,v);  // require postincrement-dereference returning value_type
X& x = ++j;         // require preincrement returning X&
}

Как видите, требования концепции в конечном итоге model деструктор. Вот почему нам нужно обмануть компилятор, чтобы создать его экземпляр.

3

Другие решения

Других решений пока нет …