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::*
是“ F
型P
的成员指针”。
FP::**
是“指向F
型P
的成员的指针”。
更多的*
在前面增加了更多的“指针”。
在这种情况下, F
failed ************
,即“指针指向failed
指针”。