#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;
}
Obie funkcje są dokładnie dopasowane. Poniżej znajduje się cytat z normą:Przeciążenie między wartością odniesienia lna a wartością rvalue
Standardowa sekwencja konwersja S1 jest lepsze niż sekwencja konwersja konwersja sekwencji standardowy S2 jeśli
...
S1 i S2 są powiązania referencyjne (8.5. 3) i nie odnosi się do niejawnego parametru obiektu niestatycznej funkcji składowej deklarowanej jako bez wartości odniesienia, a S1 wiąże odwołanie do wartości r do wartości , a S2 do wiązania wartości odniesienia o l. Wartości.
Czy to nie oznacza, że drugi jest lepszy?
Aktualizacja:
There jest powiązany pytanie. Poniższy kod jest jego uproszczoną wersją.
#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;
}
co masz na myśli mówiąc "lepiej"? – user463035818
Fwiw, to [powiodło się z klangiem] (https://godbolt.org/g/gi1C9n) – WhozCraig
To włącza, czy 'int (& ref) [6]' jest "odwołaniem do lwartości", jak podano w cytacie. Chociaż jest to odniesienie, można argumentować, że nie jest to odniesienie do lwartości. Jeśli tak, możesz przypisać 'ref', tzn.' Ref = '. Ale nie możesz. –