【发布时间】:2017-09-08 12:06:11
【问题描述】:
#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 if
...
S1 和 S2 是引用绑定 (8.5.3),两者都没有引用 声明的非静态成员函数的隐式对象参数 没有 ref 限定符,并且 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;
}
【问题讨论】:
-
“更好”是什么意思?
-
Fwiw,这个succeeds with clang
-
这会打开
int (&ref)[6]是否是“左值引用”,正如引用中所引用的那样。尽管这是一个引用,但可以说这不是对左值的引用。如果是,您可以分配给ref,即ref=<something>。但你不能。 -
直到从数组到指针衰减创建的指针是prvalue(我想回想起来并不奇怪)
-
@SamVarshavchik 为什么,当然是这样。 8.3.2 [dcl.ref] "使用
&声明的引用类型称为左值引用"。
标签: c++ overloading language-lawyer rvalue-reference