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 thoughdefault_
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