explicit

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.