SFINAE 禁止临时调用时检测操作
SFINAE to detect operation when it is forbidden to call with temporary
可以使用下面的模式来检测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
,因为没有重载接受临时。不知何故,在 x(val)
.
的测试之前必须有一个 Bar val
std::declval<T>()
returns a T&&
所以更好的匹配是 Foo const& x(Bar const&&)
.
但你可以在 std::declval
中使用左值引用来获取左值:
template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<T&>()))>>:std::true_type{};
或
template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<const T&>()))>>:std::true_type{};
根据您的需要。
可以使用下面的模式来检测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
,因为没有重载接受临时。不知何故,在 x(val)
.
Bar val
std::declval<T>()
returns a T&&
所以更好的匹配是 Foo const& x(Bar const&&)
.
但你可以在 std::declval
中使用左值引用来获取左值:
template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<T&>()))>>:std::true_type{};
或
template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<const T&>()))>>:std::true_type{};
根据您的需要。