Неверное разрешение перегрузки для функций с двумя аргументами

Позволять'Возьмите следующий пример программы:

#include 

namespace half_float
{
    template struct half_expr {};

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

    template half sin(const half_expr&);
    template half atan2(const half_expr&, const half_expr&);
}

using namespace std;
using half_float::half;

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

ВVS 2010 это прекрасно компилируется (пока игнорируем очевидные ошибки компоновщика). Но вVS 2012 это дает мне:

ошибка C2440: 'преобразование» : не могу конвертировать из 'поплавок» кhalf_float :: половина»

Так что, похоже, разрешение перегрузки невыбрать версию из пространства именhalf_float (что ADL должен выполнить), но один изstd используя неявное преобразование вfloat, Но странно то, что это происходит только дляatan2 звоните, а неsin вызов.

В более крупном проекте, где эта ошибка фактически впервые возникла у меня, она также возникает для других функций с двумя аргументами (или, скорее всего, с 2half аргументы), какfmod, но не для любой функции с 1 аргументом. Аналогично в более крупном проекте он также отлично работает дляgcc 4.6 / 4.7 а такжелязг 3.1 без ошибок, хотя я неt проверить эту версию SSCCE явно там.

Итак, мой вопрос, это ошибочное поведение наVS 2012 'сторона (учитывая, что это происходит только для2012 и только для функции с двумя аргументами), или я наблюдал за некоторыми тонкостями в правилах разрешения перегрузки (которые, я думаю, могут быть немного хитрыми)?

РЕДАКТИРОВАТЬ: Это также произойдет, если ям напрямуюusing namespace half_float или поместите все это в глобальное пространство имен напрямую. Точно так же это произойдет, если яя неusing namespace std, но это скорее VS-реализация, помещающая математические функции в глобальное пространство имен.

РЕДАКТИРОВАТЬ: Бывает как с оригиналомВК 2012 компилятор, а такжеНоябрь 2012 ОСАГО этого

РЕДАКТИРОВАТЬ: Хотя я'я не совсем уверен, что это действительно нарушение стандарта в самом строгом смысле, я подалошибка поскольку он основан на выводах из моего ответа, поскольку он по меньшей мере не соответствует определению функций с 1 аргументом и заслуживает дальнейшего изученияВ.С.-Team.

Ответы на вопрос(3)

Ваш ответ на вопрос