Здесь необходимо два последовательных неявных преобразования типов, однако C ++ может выполнить одно неявное преобразование для вас. Если вы хотите, чтобы компилятор генерировал для вас правильный типизированный код, используйте template
для функции f
, как показано ниже.
template <typename T>
void f(const T & x) { std::cout << x << std::endl;}
Причина, по которой вам нужно преобразование двух типов, заключается в наличии только одного конструктора, который принимает тип V
в структуре. Если вы хотите избавиться от преобразования двух типов в качестве второго решения, вы можете добавить другой конструктор, который принимает int
в качестве параметра, например, следующий
struct A {
int i;
A(V v) : i{v.i} {}
A(int theI) : i{theI} { }
};