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

What does P::************ mean in Boost assert.hpp file?

本文关键字:是什么 意思 文件 assert Boost hpp      更新时间:2023-10-16

在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++吗?

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

在前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*>::************)’
它是类型 P 的指针到指针到

-...-成员,其中成员是指针到指针到的数据成员-...- failed

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

F P::*是"指向类型为FP成员的指针"。

F P::** 是"指向类型 FP成员的指针"。

* 秒越多,前面的"指针"就越多。

在这种情况下,Ffailed ************,即"指针到指针到...指向failed的指针"。