考虑下面的代码:为什么编译器在与转换运算符一起使用时不能推导出模板参数?
#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