Рассмотрим следующий код:
#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++ версии 5 и более поздней (и, конечно, флаг -std = С++ 14) этот код выводит
1 0
как и следовало ожидать. Вместе с g++ версии 4.9 (и флаг -std = С++ 14) он выдает
1 1
Оба утверждают, что используют один и тот же языковой стандарт, так что проблема здесь?