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.