当通过Clang静态分析器分析一些依赖于Boost的代码时,我得到了以下错误:
名为C++对象指针的逻辑错误为空usage.hpp 22
来自boost/concept/usage.hpp中的以下代码
template <class Model>
struct usage_requirements
{
~usage_requirements() { ((Model*)0)->~Model(); }
};问题:这是Boost中的一个真正的bug,还是Boost.Concept通过空指针调用析构函数来在概念检查期间生成编译器错误?
发布于 2013-07-05 09:50:37
*免责声明。吃点盐吧,我绝不是一个提振概念的专家。
它用于使编译器实例化“模型”析构函数,使编译器为概念失败生成错误。
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析构函数中。这就是为什么我们需要欺骗编译器来实例化它。
https://stackoverflow.com/questions/17485520
复制相似问题