Компилятору разрешено только одно неявное преобразование, но вы можете добавить перегрузку для bar
, которая пытается преобразовать все, что вы ему передаете, в foo
, а затем вызывает исходный bar
с временным foo
(который это то, что произошло бы, если бы в исходном коде было разрешено два неявных преобразования):
template<typename T>
void bar(T& v) {
return bar(foo(v));
}
Поскольку конструктор преобразования в foo
не принимает аргумент const&
, это также не может bar
перегрузка.