#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是,如果
...
S1和S2是參考綁定(8.5比 標準轉換序列S2更好的轉換序列。 3),既沒有引用ref-qualifier,也沒有引用 的非靜態成員函數的隱式對象參數,並且S1將右值引用綁定到右值 ,並且S2綁定了左值引用。
這不是暗示第二個更好嗎?
更新時間:
There是一個相關的問題。下面的代碼是它的簡化版本。
#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;
}
你的意思是「更好」是什麼意思? – user463035818
Fwiw,這個[成功與clang](https://godbolt.org/g/gi1C9n) – WhozCraig
這將打開'int(&ref)[6]'是否是一個「左值引用」,如引用中引用。儘管這是一個參考,但可以認爲這不是對左值的參考。如果是,你可以指定'ref',即'ref ='。但你不能。 –