请看以下代码:
#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
来说不是这种情况。
有什么想法吗?
operator struct wrapper <int> ()
是什么?它声明了operator wrapper
还是operator ()
? - cat