最初,右值引用提案说,如果P
是“右值引用类型”,就会发生转换。然而,后来发现了一份缺陷报告
此外,考虑这种情况:
template <class T> void f(const T&&);
...
int i;
f(i);
如果我们在这种情况下推断T
thenint&
调用f(i)
,f<int&>(int&)
这似乎违反直觉。我们更喜欢这样f<int>(const int&&)
称呼。因此,我们希望澄清措辞,A&
即 14.8.2.1 [temp.deduct.call] 第 3 段中的扣除规则仅适用于表格T&&
,而不适用cv T&&
于注释当前所暗示的。
似乎有一段时间const T &&
,随着T
存在U&
,被转变为const U&
。这已更改为与另一条规则一致,即const T
, where T
isU&
将保留U&
(忽略引用上的 cv 限定符)。因此,当您T
在上面的示例中推断为int&
时,函数参数将保留int&
,而不是 const int&
。
在缺陷报告中,报告者声明“我们更喜欢f<int>(const int&&)
被称为”,但在缺陷报告中没有提供任何理由。我可以想象,原因是在不引入与其他规则不一致的情况下解决这个问题似乎太复杂了。
我们还应该记住,缺陷报告是在右值引用仍然可以绑定到左值的时候进行的——即const int&&
可以绑定到一个 int 左值。直到后来,当 Dave & Doug 的一篇论文“RValue References 的安全问题”出现时,这才被禁止。所以,在我看来,一个有效的推论(当时)比一个简单地违反直觉和放弃限定词的推论更有价值。