2016-04-30 8 views
0

Ich habe versucht folgende Code ausgeführt wird, die auf void_t Trick verlassen sollte, wo speziellere Klasse Vorlage sollte (in diesem Fall zweiten)C++ SFINAE void_t funktioniert nicht

#include <iostream> 
#include <type_traits> 

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

template <class T, class = void> 
struct is_incrementable : public std::false_type { }; 
template <class T> 
struct is_incrementable<T, void_t<decltype(++(std::declval<T>()))>> : public std::true_type { }; 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << is_incrementable<int>::value << std::endl; 
    return 0; 
} 

ich MSVC bin mit 2015 gewählt werden Das Ergebnis von is_incrementable<int>::value ist falsch. Ist irgendetwas mit meinem Code falsch oder gibt es ein Problem mit meinem Compiler?

Antwort

2

std::declval<T> Rückgabetyp hat T&&, so ist ein std::declval<int>()rvalue vom Typ int. Das Ergebnis von "false" besagt, dass ein intrvalue nicht inkrementierbar ist, was korrekt ist.

Sie können std::declval<T> mit std::declval<T&> ersetzen Sie das Programm, um Ihnen zu sagen, ob ein lvalue vom Typ T inkrementierbarer ist. Wenn Sie diese Änderung an Ihrem Programm vornehmen, sollte es "True" ausgeben.

+0

Ich habe nicht daran gedacht, jetzt funktioniert es, danke. –