C ++ SFINAE void_t无效

时间:2016-04-30 00:20:20

标签: c++ templates sfinae

我尝试运行以下代码,这应该依赖于void_t技巧,其中应该选择更专业的类模板(在这种情况下是第二个)

#include <iostream>
#include <type_traits>

template <class ...>
using void_t = void;

template <class T, class = void>
struct is_incrementable : public std::false_type { };
template <class T>
struct is_incrementable<T, void_t<decltype(++(std::declval<T>()))>> : public std::true_type { };

int main()
{
    std::cout << std::boolalpha;
    std::cout << is_incrementable<int>::value << std::endl;
    return 0;
}

我正在使用MSVC 2015.但是,is_incrementable<int>::value的结果是错误的。我的代码有什么问题或我的编译器有问题吗?

1 个答案:

答案 0 :(得分:2)

std::declval<T>的返回类型为T&&,因此std::declval<int>()int类型的 rvalue 。 &#34; false&#34;的结果告诉您int rvalue 不可递增,这是正确的。

您可以将std::declval<T>替换为std::declval<T&>,让程序告诉您T类型的左值是否可递增。如果您对程序进行了此更改,则应打印&#34; true&#34;。