SFINAE auf Operator prüfen + =

Ich versuche, eine Überlastung aus einem Überlastsatz zu entfernen, wennoperator+= wird vermisst

Ich kann überprüfen, obT+T ist legal:

template<typename T,
         typename CheckTplusT = decltype(std::declval<T>() + std::declval<T>())>
void foo(T a, T b, ...)
{
  a = a + b;
}

Aber das funktioniert nicht für+=

template<typename T,
         typename CheckTplusT = decltype(std::declval<T>() += std::declval<T>())>
void foo(T a, T b, ...)
{
  a += b;
}

Ist dies durch Verwendung eines anderen Ausdrucks in @ behebbadecltype Oder brauche ich ein anderes SFINAE-Konstrukt?

Der Grund, warum ich dies aus dem Überlastsatz entfernen muss, ist, dass es mit einer anderen Überlast zusammenstößt, die einen Funktor als Alternative zu @ akzeptier+=. Compiler sind VS2013, gcc4.8

Antworten auf die Frage(4)

Ihre Antwort auf die Frage