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


80

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


38
Pointerception ...
Jakub Arnold

5
@deviantfan在生产代码中?您会感到惊讶。;)但是,这里的要点是试图以P很高的确定性引用一个不存在的成员,从而导致编译失败。(在C ++ 11中,您可能只会使用它static_assert(false),但是Boost必须可以移植到C ++ 11之前的版本。)
cdhowie 2014年

4
旁注:12级指针可能与C标准所需的最小值有关。
TC

29
@PaulDraper它实际上是hunter2hunter2hunter2hunter2在这里阅读
sehe 2014年

5
指向一个指针的指针指向一个指针的指针指向一个指针的指针指向一个指针的指针指向一个指针的指针指向一个指向类型为P的成员的指针的指针
2014年

Answers:


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

45

这是类型为……的指针到指针的成员P,其中该成员是类型为……到指针的数据成员failed

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


19

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.