[英]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
小號演繹不同類型( String
為a
和Person
為b
)。 由於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.