Rozważmy następujący kod:Dlaczego idiom wykrywania void_t <> nie działa z gcc-4.9?
#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 ++ wersji 5 i później (a -std = C++ 14 znaczników, oczywiście), kod wyjścia
1 0
jak należy. Z g ++ w wersji 4.9 (i -std = C++ 14 Flag), jednak wyprowadza
1 1
Obaj twierdzą, że stosując tę samą normę językową, więc co za problem tutaj?
Czy używasz wersji 4.9.0 lub wyższej? Widziałem kilka błędów w wersji 4.9.0, które zostały naprawione, jeśli przejdziesz do 4.9.2. – NathanOliver
4.9.3 być dokładnym –
Cóż, to było wszystko, co mogłem wnieść. jeśli to sprawia, że czujesz się lepiej, to działa również na klang. – NathanOliver