簡體   English   中英

為什么忽略模板參數中的cv限定詞?

[英]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 ++。

這個調用是模棱兩可的,因為任何東西都可以匹配Tconst 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM