[英]Why are cv-qualifiers in template parameters ignored?
我有一些無法編譯的代碼,相當於下面顯示的內容。 經過一番挖掘后,我遇到了第14.1段注釋5,其中指出:
確定模板參數的類型時,將忽略模板參數上的頂級cv限定詞。
我的代碼如下所示:
#include <iostream>
#include <typeinfo>
class Bar {};
template<class T>
void Func(T t)
{
std::cout << typeid(T).name() << "\n";
}
template<class T>
void Func(const T& t)
{
std::cout << "const ref : " << typeid(T).name() << "\n";
}
int main()
{
Bar bar;
const Bar& constBar = bar;
Func(constBar);
return 0;
}
它給出了此編譯錯誤:
In function 'int main()' error: call of overloaded 'Func(const Bar&)' is ambiguous
有人可以評論標准中此規則背后的原因嗎?
您的代碼的問題在於函數調用是不明確的。 const Bar&可以匹配值或const引用。 G ++說:
xx.cpp:24: error: call of overloaded 'Func(const Bar&)' is ambiguous
這與模板沒有什么特別的關系-如果重載非模板函數,則會出現相同的錯誤。
正如人們在不時地告訴您的那樣,您不會通過閱讀標准來學習C ++。
這個調用是模棱兩可的,因為任何東西都可以匹配T
或const T &
。
只需嘗試Func(0);
:它將給出相同的錯誤消息。
就像您自己很容易發現的那樣,這與模板無關。 這個
class Bar {};
void Func(Bar) {}
void Func(const Bar&) {}
int main()
{
Bar bar;
const Bar& constBar = bar;
Func(bar);
Func(constBar);
return 0;
}
給出相同的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.