【发布时间】:2018-08-12 00:10:29
【问题描述】:
我正在使用 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
所以我的问题是:为什么会发生这种情况?
【问题讨论】:
-
最好在你的问题中包含错误信息。
-
clang 的解决方法:
std::enable_if_t<has_length(T{}), void>。但是,GCC 会抱怨任何一种方式。 -
@ildjarn 我完全忘记了.....
-
@ildjarn:如果同时添加
constexpr mine()和constexpr mine(const mine&),那么it works。 -
@ildjarn:我的评论不够清楚,抱歉:这与
constexpr无关。如果添加复制构造函数,则还应添加默认构造函数。然后clang compiles the example withauto foo(T).
标签: c++ c++14 sfinae boost-hana