其他分享
首页 > 其他分享> > c – 在hana的教程中使用nonconstexpr对象的static_assert

c – 在hana的教程中使用nonconstexpr对象的static_assert

作者:互联网

阅读hana’s tutorial,我想知道static_assert如何按预期工作:

template <typename Any>
auto switch_(Any& a) {
  return [&a](auto ...cases_) {
    auto cases = hana::make_tuple(cases_...);

    auto default_ = hana::find_if(cases, [](auto const& c) {
      return hana::first(c) == hana::type_c<default_t>;
    });

    static_assert(default_ != hana::nothing,
      "switch is missing a default_ case");

    // ...
  };
}

文档明确指出default_不是constexpr对象,因此,即使运算符!=对这些类型的重载是constexpr函数,表达式default_!= hana :: nothing也不能是常量表达式,因为它的一个参数是“T.

教程说:

Notice how we can use static_assert on the result of the comparison
with nothing, even though default_ is a non-constexpr object? Boldly,
Hana makes sure that no information that’s known at compile-time is
lost to the runtime, which is clearly the case of the presence of a
default_ case.

教程在该段落中引用了什么,或者该表达式如何工作?

解决方法:

你误解了constexpr的要求.您可以将非constexpr args传递给constexpr函数,结果可以是constexpr.

玩具示例:

struct foo {
  int x;
  foo(int in):x(in){}
  friend constexpr bool operator==(foo const&, foo const&) { return true; }
};

然后

foo a{1}, b{2};
static_assert( a==b, "works" );

完全有效.

哎呀,我可以在堆上分配那些foo,而==仍然会评估为constexpr表达式.

default_不是constexpr,但只能使用default_的类型信息来完成它的比较,该信息在编译时可用.没有什么能比得上hana :: nothing,但是(没有另一个例子)没什么.

struct toy_nothing_t {
  friend constexpr bool operator==(toy_nothing_t const&, toy_nothing_t const&) {
    return true;
  }
  template<class T>
  friend constexpr bool operator==(T const&, toy_nothing_t const&) {
    return false;
  }
  template<class T>
  friend constexpr bool operator==(toy_nothing_t const&, T const&) {
    return false;
  }
};

这个toy_nothing_t有类似的属性.

标签:static-assert,c,constexpr
来源: https://codeday.me/bug/20190823/1700245.html