P :: ************在Boost assert.hpp文件中是什么意思?

在boost / mpl / assert.hpp中 ,我看到如下所示:

template<class Pred> struct eval_assert { typedef typename extract_assert_pred<Pred>::type P; typedef typename P::type p_type; typedef typename ::boost::mpl::if_c<p_type::value, AUX778076_ASSERT_ARG(assert<false>), failed ************ P::************ >::type type; }; 

如果第一个************可以作为struct的指针处理失败,那么P::************对我来说真的没有任何意义。 这是标准的C ++吗?

这段代码的目的是帮助编译器产生“可见的”错误信息。

static_assert时代之前,编译一个模板static_assert代码,即使是单个错误,也很容易产生大约100行的错误信息,其中99%往往没有意义。

十指针技巧有助于指出实际的错误,例如:

  BOOST_STATIC_ASSERT((std::is_same<T,U>)); 

用gcc编译的T=void*U=char*会产生~10个错误行,但是你可以很容易的看到相关的:

 error: no matching function for call to 'assertion_failed(mpl_::failed************ std::is_same<void*, char*>::************)' 

这是一个指向P型指针的成员,其中成员是types指针指向数据成员failed的指针。

在这种情况下,目标仅仅是通过以非常高的可能性引用P一个成员而导致编译失败。 在C ++ 11中,您只需使用static_assert ,但是当然Boost需要可移植到Pre-C ++ 11方言。

FP::*是“ FP的成员指针”。

FP::**是“指向FP的成员的指针”。

更多的*在前面增加了更多的“指针”。

在这种情况下, F failed ************ ,即“指针指向failed指针”。