MSVC — C2668 неоднозначный вызов перегруженной функции — это ошибка компилятора?

#c #visual-studio #visual-c #cl

#c #visual-studio #visual-c #cl

Вопрос:

MSVC 19.28 отклоняет следующий код с сообщением об ошибке: C2668 неоднозначный вызов перегруженной функции A::Foo . Это ошибка компилятора? Он отлично компилируется с &cc, clan& и даже msvc 19.10. Сбой с MSVC 19.14, смотрите здесь

 #include <iostream&&t;

class A {
public:
    template<typename T&&t;
    void Foo(int = {}) {
        std::cout << "Hello World";
    }

    template<typename... T, typename... Ar&s&&t;
    void Foo(Ar&samp;amp;... ar&s) {

    }
};

int main()
{
    A a;
    a.Foo<int&&t;();
}
  

Ответ №1:

Для вызова Foo<int&&t;() компилятор может сделать вывод Foo<int&&t;() как для первого шаблона, так и Foo<int&&t;(void) для второго.

Из temp.deduct.partial#11:

… если G имеет завершающий пакет параметров функции, для которого у F нет соответствующего параметра, и если у F нет завершающего пакета параметров функции, то F более специализирован, чем G.

Это прерыватель связи, и выбирается первый шаблон.

Невозможность устранить неоднозначность, по-видимому, является ошибкой MSVC.

Комментарии:

1. «для которого у F нет соответствующего параметра» — но у F есть соответствующий параметр, анонимный int параметр?