#include <iostream>
using namespace std;
void func(int (&ref)[6]) { cout << "#1" << endl; }
void func(int * &&ref) { cout << "#2" << endl; }
int main()
{
int arr[6];
func(arr); // g++(5.4): ambiguous, clang++(3.8): #2, vc++(19.11): #1
return 0;
}
Обе функции являются точными совпадениями. Ниже приведена цитата из стандарта:
Стандартная последовательность преобразования S1 является лучшей последовательностью преобразования, чем стандартная последовательность преобразования S2, если
...
S1 и S2 являются ссылочными привязками (8.5.3), и ни одна из них не ссылается на неявный параметр объекта объявленной нестатической функции-члена без ref-qualifier, а S1 связывает ссылку rvalue с rvalue и S2 связывает ссылку lvalue.
Не означает ли это, что второе лучше?
Обновлено:
Там есть связанный вопрос. И следующий код является упрощенной версией.
#include <iostream>
using namespace std;
void func(int *&) { cout << "#1" << endl; }
void func(int *&&) { cout << "#2" << endl; }
int main()
{
int arr[6];
func(arr); // g++(5.4) and clang++(3.8): #2, vc++(19.11): ambiguous
return 0;
}