P::************** 在 Boost assert.hpp 文件中是什么意思
What does P::************ mean in Boost assert.hpp file?
在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::*
是"指向类型为F
的P
成员的指针"。
F P::**
是"指向类型 F
的P
成员的指针"。
*
秒越多,前面的"指针"就越多。
在这种情况下,F
是failed ************
,即"指针到指针到...指向failed
的指针"。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思