Неверное разрешение перегрузки для функций с двумя аргументами
Позволять'Возьмите следующий пример программы:
#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.