为什么Boost.Concept通过空指针调用析构函数?

时间:2013-07-05 09:27:47

标签: c++ boost c++11 clang-static-analyzer c++-concepts

当通过Clang静态分析器分析一些Boost相关代码时,我收到以下错误:

  

逻辑错误调用C ++对象指针为null usage.hpp 22

来自boost/concept/usage.hpp

中的以下代码
template <class Model>
struct usage_requirements
{
    ~usage_requirements() { ((Model*)0)->~Model(); }
};

问题:这是Boost中的真正错误还是Boost.Concept通过空指针调用析构函数以在概念检查过程中以某种方式生成编译器错误?

1 个答案:

答案 0 :(得分:3)

*免责声明。拿一些盐,我绝不是Boost Concept专家。

它用于使编译器实例化“Model”析构函数,使编译器为概念失败生成错误。

usage_requirements与创建新概念时使用的BOOST_CONCEPT_USAGE一起使用,请参阅文档中的Creating Concepts

#   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析构函数中。这就是为什么我们需要欺骗编译器来实例化它。