template <typename T> void f(T&) {}
template <typename T> void f(T&&) {}
int main()
{
int x;
f(x); //ambiguous
}
爲什麼這個調用不明確?第一個模板專業化是f <int>
(int &),第二個是f <int&>
(int &)。由於參數相同,根據偏序排列規則更加專門化的函數模板更好。然後根據標準14.8.2.4/9帶參考參數的重載功能模板
如果,對於給定類型,扣除在兩個方向成功(即,類型是相同的上述轉換之後)和兩個P和A分別引用類型(即前替換爲上面提到的類型):
- 如果參數模板中的類型是一個左值引用,並且參數模板中的類型不是,則參數類型被認爲比另一個更專用; ...
第一個模板是T &和第二是T & &,所以首先應該是更加專業化。這裏有什麼問題?
編輯: 該代碼以g測試++ 4.6.1和VC++ 2010 Express中,既得到不明確的錯誤。
有一個關於歧義的缺陷報告和您引用的規則被添加。不幸的是我現在在我的手機上,所以我不能給你鏈接。 – 2012-03-27 08:19:04