考慮下面的代碼:爲什麼編譯器在與轉換運算符一起使用時不能推導出模板參數?
#include <utility>
template<typename T>
struct wrapper {
T value;
};
struct foo {
operator wrapper<int>() {
return{10};
}
};
int main() {
foo f;
wrapper w = f; // error
std::pair p = std::make_pair(1, 0); // ok
}
gcc 7.1.1未能在標線來編譯上面:
main.cpp: In function 'int main()': main.cpp:17:17: error: class template argument deduction failed: wrapper w = f; // error ^ main.cpp:17:17: error: no matching function for call to 'wrapper(foo&)' main.cpp:4:8: note: candidate: template<class T> wrapper(wrapper<T>)-> wrapper<T> struct wrapper { ^~~~~~~ main.cpp:4:8: note: template argument deduction/substitution failed: main.cpp:17:17: note: 'foo' is not derived from 'wrapper<T>' wrapper w = f; // error ^
f
可轉換爲wrapper<int>
,所以我希望這樣的事情發生。從那裏編譯器應該能夠推斷出T
是int
。但它不能。
編譯器可以正確推導出std::pair
的模板參數,所以我想知道爲什麼這不是wrapper
。
任何想法?
IMO如果類模板扣除查看轉換運算符,會引起混淆。如果需要的話,應該使用明確的扣除指南。 – cpplearner
相關:https://stackoverflow.com/q/43019240/1896169 – Justin
這是什麼'運算符結構包裝()'?它是否聲明'operator wrapper'或'operator()'? –
cat