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;