sto*_*yan 80 c++ boost pointers
在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;
};
Run Code Online (Sandbox Code Playgroud)
如果第一个************可以被视为struct失败的指针,那P::************对我来说真的没有任何意义.这是标准的C++吗?
sba*_*bbi 100
此代码的要点是帮助编译器生成"可见"错误消息.
在前期static_assert,编译模板繁重的代码很容易产生大约100行错误消息,即使是一个错误,99%的这些行通常没有意义.
10指针技巧有助于指出实际错误,例如:
BOOST_STATIC_ASSERT((std::is_same<T,U>));
Run Code Online (Sandbox Code Playgroud)
随着T=void*并U=char*用gcc编译生成〜10个错误行,但你可以很容易地看到相关的一个:
error: no matching function for call to ‘assertion_failed(mpl_::failed************ std::is_same<void*, char*>::************)’
Run Code Online (Sandbox Code Playgroud)
cdh*_*wie 45
它是指向类型的指针指针成员P,其中成员是指向指针指向-...-类型的数据成员failed.
在这种情况下,目标只是通过引用P具有非常高概率且不存在的成员来使编译失败.在C++ 11中,您只需使用它static_assert,但当然Boost需要可移植到预C++ 11方言.
T.C*_*.C. 19
F P::*是"指向P类型成员的指针F".
F P::**是"指向P类型成员的指针F".
更多*s在前面添加了更多"指针".
在这种情况下,F是failed ************,"指向指向...指针的指针failed".