首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Boost.Concept要通过空指针调用析构函数?

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

Stack Overflow用户
提问于 2013-07-05 09:27:46
回答 1查看 379关注 0票数 1

当通过Clang静态分析器分析一些依赖于Boost的代码时,我得到了以下错误:

名为C++对象指针的逻辑错误为空usage.hpp 22

来自boost/concept/usage.hpp中的以下代码

代码语言:javascript
复制
template <class Model>
struct usage_requirements
{
    ~usage_requirements() { ((Model*)0)->~Model(); }
};

问题:这是Boost中的一个真正的bug,还是Boost.Concept通过空指针调用析构函数来在概念检查期间生成编译器错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-05 09:50:37

*免责声明。吃点盐吧,我绝不是一个提振概念的专家。

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

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

代码语言:javascript
复制
#   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()

它的用法如下:

代码语言:javascript
复制
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&
}

最后的结果是:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17485520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档