I understand that the keyword explicit can be used to prevent implicit conversion.
For example
Foo { public: explicit Foo(int i) {} }
It introduces unexpected temporaries:
struct Bar { Bar(); // default constructor Bar( int ); // value constructor with implicit conversion }; void func( const Bar& ); Bar b; b = 1; // expands to b.operator=( Bar( 1 )); func( 10 ); // expands to func( Bar( 10 ));