P :: ************在Boost assert.hpp文件中的含义是什么?

时间:2014-11-19 20:01:47

标签: c++ pointers boost

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;
};

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

3 个答案:

答案 0 :(得分:100)

此代码的目的是帮助编译器生成“可见”错误消息。

static_assert之前的时代,编译模板繁重的代码很容易产生大约100行错误消息,即使是一个错误也是如此,其中99%的行通常没有意义。

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

 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*>::************)’

答案 1 :(得分:45)

它是指向P类型的指针指向成员,其中成员是指向指针指向-...-的类型的数据成员。 failed

在这种情况下,目标只是通过引用P的成员来使编译失败,并且它很可能不会存在。在C ++ 11中,您只需使用static_assert,但当然Boost需要可移植到C ++ 11之前的方言。

答案 2 :(得分:19)

F P::*是“指向P类型F成员的指针”。

F P::**是“指向P类型F成员的指针”。

更多* s会在前面添加更多“指针”。

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