可以使用以下模式来检测是否可以将 x 应用于 T
template<class T, class Enable = void>
struct CanDoX: std::false_type{};
template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<T>()))>>:std::true_type{};
如果x
被定义为
Foo const& x(Bar const&&) = delete;
Foo const& x(Bar const& val)
{return val.get();}
现在CanDoX<Bar>::value
是false
,因为没有重载接受临时的。Bar val
不知何故,在测试之前必须有一个x(val)
。