When a constructor is specified as explicit, no automatic conversion will be used with that constructor – but parameters passed to the constructor may still be converted. For example:
struct foo { explicit foo( int a ) : a_( a ) { }
int a_; };
int bar( const foo & f ) { return f.a_; }
bar( 1 ); // fails because an implicit conversion from int to foo // is forbidden by explicit.
bar( foo( 1 ) ); // works -- explicit call to explicit constructor.
bar( foo( 1.0 ) ); // works -- explicit call to explicit constructor // with automatic conversion from float to int.