Nieprawidłowa rozdzielczość przeciążenia dla funkcji 2-argumentowych

Weźmy następujący przykładowy program:

#include <cmath>

namespace half_float
{
    template<typename T> struct half_expr {};

    struct half : half_expr<half>
    {
        operator float() const;
    };

    template<typename T> half sin(const half_expr<T>&);
    template<typename T> half atan2(const half_expr<T>&, const half_expr<T>&);
}

using namespace std;
using half_float::half;

int main()
{
    half a, b;
    half s = sin(a);
    half t = atan2(a, b);
}

WVS 2010 kompiluje się dobrze (na razie ignoruj ​​oczywiste błędy linkera). Ale wVS 2012 to daje mi:

błąd C2440: „konwersja”: nie można przekonwertować z „float” na „half_float :: half”

Wygląda więc na to, że rozdzielczość przeciążenia nie wybiera wersji z przestrzeni nazwhalf_float (który ADL powinien osiągnąć), ale ten zstd przy użyciu niejawnej konwersji nafloat. Ale dziwne jest to, że dzieje się tak tylko dlaatan2 zadzwoń, a niesin połączenie.

W większym projekcie, w którym ten błąd wystąpił po raz pierwszy, występuje również w przypadku innych 2-argumentowych funkcji (a raczej tych z 2half argumenty), jakfmod, ale nie dla żadnej funkcji 1-argumentowej. Podobnie w większym projekcie działa również dobrzegcc 4.6 / 4.7 iclang 3.1 bezbłędnie, chociaż nie przetestowałem tam wyraźnie tej wersji SSCCE.

Moje pytanie brzmi, czy to błędne zachowanieVS 2012po stronie (biorąc pod uwagę, że dzieje się tak tylko dla2012 i tylko dla funkcji 2-argumentowej), czy też nadzorowałem pewne subtelności w regułach rozdzielczości przeciążenia (co chyba może być nieco skomplikowane)?

EDYTOWAĆ: Dzieje się tak również, gdy jestem bezpośredniousing namespace half_float lub umieść całość w globalnej przestrzeni nazw bezpośrednio. Podobnie też się dzieje, jeśli nie jestemusing namespace std, ale jest to raczej implementacja VS umieszczająca funkcje matematyczne w globalnej przestrzeni nazw.

EDYTOWAĆ: Dzieje się tak z oryginałemVC 2012 kompilator jak równieżListopad 2012 CTP tego.

EDYTOWAĆ: Chociaż nie jestem do końca pewien, czy jest to naruszenie standardu w ścisłym tego słowa znaczeniu, złożyłempluskwa na podstawie ustaleń zawartych w mojej odpowiedzi, ponieważ jest ona co najmniej niespójna z definicją funkcji 1-argumentowych i zasługuje na dalsze badanie przezVS-Zespół.

questionAnswers(3)

yourAnswerToTheQuestion