【问题标题】:What does P::************ mean in Boost assert.hpp file?Boost assert.hpp 文件中的 P::************ 是什么意思?
【发布时间】:2015-01-17 12:10:46
【问题描述】:

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

【问题讨论】:

  • 指针感知 ...
  • @deviantfan 在生产代码中?你会感到惊讶。 ;) 但是这里的重点是通过尝试引用P 的成员来导致编译失败,并且非常确定它不会存在。 (在 C++11 中,您可能只使用 static_assert(false),但当然 Boost 必须可移植到 C++11 之前的版本。)
  • 旁注:12级指针可能与C标准要求的最小值有关。
  • @PaulDraper 实际上在这里阅读hunter2hunter2hunter2hunter2
  • 指向指针的指针 指向指针的指针 指向指针的指针 指向指针的指针 指向指针的指针 指向指针的指针 指向类型成员的指针P

标签: c++ pointers boost


【解决方案1】:

这段代码的目的是帮助编译器产生“可见”的错误信息。

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

【讨论】:

    【解决方案2】:

    它是P 类型的指向指针指向-...成员的指针,其中该成员是指向指针指向-...-failed 类型的数据成员。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 2011-08-31
        相关资源
        最近更新 更多