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ół.