在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 ++吗?
答案 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会在前面添加更多“指针”。
在这种情况下,F
是failed ************
,即“指向指向failed
的指针的指针”。