gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:40 24 4
gpt4 key购买 nike

在通过Clang静态分析器分析一些依赖Boost的代码时,出现如下错误:

Logic error Called C++ object pointer is null usage.hpp 22

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

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

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

最佳答案

*免责声明。把它和一些盐放在一起,我绝不是 Boost Concept 专家。

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

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

关于c++ - 为什么 Boost.Concept 通过空指针调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17485520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com