В следующем коде clang и EDG диагностируют неоднозначный вызов функции, в то время как gcc и Visual Studio принимают код.
struct s
{
typedef void(*F)();
operator F(); //#1
operator F() const; //#2
};
void test(s& p)
{
p(); //ambiguous function call with clang/EDG; gcc/VS call #1
}
В соответствии со стандартным проектом С++ (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf) раздел 13.3.1.1.2 2 говорит:
суррогатная функция вызова с уникальной функцией вызова имени и имеющая функцию вызова R (идентификатор типа преобразования F, P1 a1,..., Pn an) {return F (a1,..., ап); } также рассматривается как функция-кандидат.
В приведенном выше коде кажется, что рассматриваются два определения функции вызова (по одной для каждой функции преобразования), но обе функции вызова имеют идентичные подписи (поэтому неоднозначность), поскольку cv-квалификаторы оператора преобразования не как представляется, учитываются в сигнатуре функции вызова.
Я бы ожидал, что # 1 будет называться как с gcc и Visual Studio. Так что, если clang/EDG вместо этого отвергают вышеуказанный код, может кто-то пролить свет на причину, поскольку почему стандарт предусматривает, что в этом случае должна быть двусмысленность и , которая преимущества кода из этого свойства суррогатных функций вызова? Кто прав: clang (3.5)/EDG (310) или gcc (4.8.2)/VS (2013)?