Resolução de sobrecarga incorreta para funções de 2 argumentos

Vamos pegar o seguinte exemplo de programa:

#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);
}

EmVS 2010 isso compila muito bem (ignore os óbvios erros de linker por enquanto). Mas emVS 2012 isso me dá:

erro C2440: 'conversion': não é possível converter de 'float' para 'half_float :: half'

Então parece que a resolução de sobrecarga não escolhe a versão do namespacehalf_float (qual ADL deve realizar), mas o destd usando a conversão implícita parafloat. Mas o estranho é que isso só acontece para oatan2 ligue e não osin ligar.

No projeto maior, onde esse erro realmente ocorreu pela primeira vez para mim, também ocorre para outras funções de 2 argumentos (ou melhor, aquelas com 2half argumentos), comofmod, mas não para qualquer função de 1 argumento. Da mesma forma no projeto maior também funciona bem paragcc 4.6 / 4.7 eclangor 3.1 sem erro, embora eu não tenha testado explicitamente essa versão do SSCCE.

Então, minha pergunta é: esse comportamento errôneoVS 2012do lado (dado que só acontece por2012 e apenas para a função de 2 argumentos), ou eu supervisionei algumas sutilezas nas regras de resolução de sobrecarga (o que pode de fato ser um pouco complicado, eu acho)?

EDITAR: Isso também acontece se eu sou diretamenteusing namespace half_float ou colocar a coisa toda no namespace global diretamente. Da mesma forma, isso também acontece se eu não souusing namespace std, mas esta é a implementação do VS colocando as funções matemáticas no namespace global.

EDITAR: Acontece tanto com o originalVC 2012 compilador, bem como oCTP de novembro de 2012 disso.

EDITAR: Embora eu não esteja completamente certo de que é realmente uma violação do padrão no sentido mais estrito, eu arquivei umerro para isso com base nas conclusões da minha resposta, uma vez que é pelo menos inconsistente com a definição das funções de 1 argumento e merece uma investigação mais aprofundada peloVS-Equipe.

questionAnswers(3)

yourAnswerToTheQuestion