Xét đoạn mã sau:Tại sao thành phần phát hiện void_t <> không hoạt động với 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;
}
Với g ++ phiên bản 5 và sau đó (và -std = C++ 14 lá cờ, tất nhiên), mã này đầu ra
1 0
như nó phải. Với g ++ phiên bản 4.9 (và cờ -std = C++ 14), tuy nhiên, kết quả đầu ra là
1 1
Cả hai đều yêu cầu sử dụng cùng một ngôn ngữ chuẩn, vậy vấn đề ở đây là gì?
Bạn có sử dụng 4.9.0 hoặc cao hơn không? Tôi đã thấy một số lỗi trong 4.9.0 đã được sửa chữa nếu bạn đi đến 4.9.2. – NathanOliver
4.9.3 chính xác –
Đó là tất cả những gì tôi có thể đóng góp. nếu nó làm cho bạn rơi bất kỳ tốt hơn nó hoạt động trên clang quá. – NathanOliver