Рассмотрим следующий код:
#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
.
Любые идеи?