簡體   English   中英

如果模板參數推導失敗,則decltype成功?

[英]decltype succeeds where template argument deduction fails?

我想知道為什么以下代碼在未注釋掉帶有bbb的行但在其之前的行時能按預期的方式編譯和運行,但是當未注釋掉標記為aaa的行和bbb行時,它的確會失敗是:

#include <iostream>
#include <string>
using String = std::string;
struct Person {
    String m_name;
    explicit Person(String const &name): m_name(name) {}
    operator String() const { return "\"" + m_name + "\""; }
};

template<class T> bool isEqual(
T const& a,
//T const& // does NOT compile // aaa
decltype(a) // DOES compile    // bbb
b){ return a == b; }

int main()
{
    String const  plain("plain");
    Person const jb("James");
    bool b = isEqual(plain, jb);
    std::cout << "isEqual(plain, person) is " << ( b ? "true" : "false" ) << "\n";
}

當您這樣做時:

template<class T> 
bool isEqual(T const& a, T const& b)

所述T小號演繹不同類型( StringaPersonb )。 由於T只能是一種類型,因此推論失敗。

但是,當您這樣做時:

template<class T> 
bool isEqual(T const& a, decltype(a) b)

只需要推導一對參數/參數。 T被推導出為String ,並且由於Person可以轉換為String (通過轉換函數operator String() ),因此可以正常工作。

這類似於identity技巧,在該技巧中,我們只是簡單地將一個參數強制為非推導上下文:

template <typename T>
struct identity { using type = T; };

template <typename T>
bool isEqual(T const& a, typename identity<T>::type const& b);

同樣,這里只有一對類型發生類型推導, T被推導為String因此b的類型也是String const& ,但不是因為它被推導了-因為它被替換了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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