使用"hana::is_valid"在常量引用时失败

Using `hana::is_valid` fails with const references

本文关键字:quot 常量 引用 失败 is hana 使用 valid      更新时间:2023-10-16

我正在使用hana来确定对象是否具有如下所示的Length成员:

using boost::hana::is_valid;

static const auto has_length
= is_valid([](const auto& obj)
-> decltype(obj.Length(),void()) {});

这工作正常....我可以整天用它做静态断言,让我心满意足。 所以下一步在逻辑上是enable_if一个函数:

template<typename T>
auto foo(T t) -> std::enable_if_t<has_length(t), void>
{
}
struct mine
{
int Length() const { return 0; }
};
int main()
{
foo(mine{});
}

这工作得很好。但是一旦我将T更改为const T&,我们就会收到没有合适重载的错误:Godbolt

所以我的问题是:为什么会这样?

问题是调用引用不是constexpr的函数不是constexpr。这就是hana::is_valid有用的地方,因为它返回一个类似integral_constant的值,其中包含一个静态 constexpr 布尔值,因此我们可以只查看返回类型。请参阅bool_

下面是一个示例:

#include <boost/hana.hpp>
#include <type_traits>
namespace hana = boost::hana;
static auto has_length = hana::is_valid([](auto&& t)
-> decltype(t.Length()) { });
template <typename T>
auto foo(T const& t)
-> std::enable_if_t<decltype(has_length(t)){}, void>
// ^-- notice the return type 
// is a boolean integral constant
{ }
struct mine
{
int Length() const { return 0; }
};
int main()
{
foo(mine{});
}