> Your are asking why can't the constructor be not explicit, right?
> 
> Well, this would allow the 'direct' syntax fn(1,3) that 
> Vincent wanted,
> but...
> 
> It would entirely break the pointer semantics because the 
> following would be
> allowed:
> 
> void foo()
> {
>    optional<int> opt ;
>    opt = 3 ;  // This will construct a temporary optional<int>(3)
>    if ( opt == 0 ) // tmp optional<int>(0) here.
> }

You may poison undesired operators.
 
> Even if it would be allowed to have optional<int&>, you would 
> still have to
> use it as if it were a pointer:
> 
> void foo ( optional<int&> p = optional<int&>() )
> {
>   if ( !!p ) // or ( peek(p) ) or ( initialized(p) )

BTW why do you need 3 methods that doing the same?

>   {
>      int& the_p = *p ;
>      the_p = 3 ;
>      etc...
>   }
> }

Here 2 questions:

1. Let say we have 

struct A { void moo() { ... } };

a. void foo( A* a ) { a->moo(); }
b. void foo( A& a ) { a.moo(); } // here we could assume inlining

Does both above versions are equaivalent form assembler stand point?

2. Now let say we use optional:

void foo( optional<A&> a ) { (*a).moo(); }

>From assembler stand point will it be equivalent to 1.a or 1.b?

And here yet another example where optional<T&> would be useful:

Let say I am using ostream wrapper for my printing and want to separate the
case whgen ostream& is not supplied:

class Log
{
.... 
    optional<ostream&> m_output;
{

And use it for example like this:

template<typename T>
Log::operator<<( T const& t )
{
    if( !!m_output )
     *m_output << t;
}

Would it be equivalent to reference or pointer? Or it the same in both
cases?

Gennadiy.
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to