Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么虚无<&燃气轮机;检测习惯用法不适用于gcc-4.9?_C++_Templates_G++_C++14_Sfinae - Fatal编程技术网

C++ 为什么虚无<&燃气轮机;检测习惯用法不适用于gcc-4.9?

C++ 为什么虚无<&燃气轮机;检测习惯用法不适用于gcc-4.9?,c++,templates,g++,c++14,sfinae,C++,Templates,G++,C++14,Sfinae,考虑以下代码: #include <iostream> #include <type_traits> struct Test { Test& operator++(); }; struct NoIncrement { }; template <typename...> using void_t = void; template <class, class=void_t<>> struct has_pre_increment

考虑以下代码:

#include <iostream>
#include <type_traits>

struct Test { Test& operator++(); };
struct NoIncrement { };

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

template <class, class=void_t<>>
struct has_pre_increment_member : std::false_type { };

template <class T>
struct has_pre_increment_member<T, void_t<decltype( ++std::declval<T&>() )>>
  : public std::true_type { };

int main() {
  std::cout << has_pre_increment_member<Test>::value << " ";
  std::cout << has_pre_increment_member<NoIncrement>::value << std::endl;
}
应该如此。但是,对于g++版本4.9(以及-std=c++14标志),它会输出

1 1

两者都声称使用相同的语言标准,那么这里的问题是什么呢?

这是由于,现在被认为是gcc中的一个bug(特别是-目前已修复)。这个问题背后的想法是,由于您实际上没有在此处使用模板参数:

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

这将使您的示例在我尝试的所有gcc版本中都能正确执行

您使用的是4.9.0还是更高?我在4.9.0中看到了一些bug,如果您转到4.9.2,这些bug已经修复。这就是我所能做的。如果它能让你感觉更好的话,它对叮当声也有效。这至少是一个。哦,太棒了@callyalater。很高兴知道我没有错误地使用这种语言。谢谢
template <typename...> using void_t = void;
namespace void_details {
    template <class... >
    struct make_void { using type = void; };
}

template <class... T> using void_t = typename void_details ::make_void<T...>::type;