c++ - SFINAE 禁止临时调用时检测操作

标签 c++ sfinae detection-idiom

可以使用以下模式来检测 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>::valuefalse ,因为没有重载接受临时的。不知何故,必须有一个 Bar valx(val) 测试之前.

最佳答案

std::declval<T>()返回 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{};

根据您的需要。

关于c++ - SFINAE 禁止临时调用时检测操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57696886/

相关文章:

c++ - SSE/优化 - 将数组复制到更大的数组

c++ - 更改一个类属性的数据类型会导致在构造子类对象期间出现段错误

c++ - 如何将 IStream 的内容转储(写入)到文件中(图片)

c++ - 包括标准头文件。 string.h 还是 cstring?或两者?

c++ - 为什么要使用 constexpr

c++ - 使用 SFINAE 检查类型是否完整

C++11:根据容器的 value_type 专门化/限制方法