Boost logo

Boost :

From: Ilya Sokolov (fal_delivery_at_[hidden])
Date: 2007-08-24 07:10:57


Andrey Semashev wrote:

> Consider the following examples:
>
> Example 1:
>
> void foo(std::set< int >& my_set)
> {
> bool commit = false;
> std::set< int >::iterator it = my_set.insert(10);
> BOOST_SCOPE_EXIT((my_set)(it)(commit))
> {
> // Which one will be erased here?
> // Not necessarily the one we intended to.

Sorry for such late response.
Can you explain what is intended value of it?

> if (!commit)
> my_set.erase(it);
> }
> BOOST_SCOPE_EXIT_END
>
> // Do smth. with "it"
>
> it = my_set.find(5); // and reuse it
>
> // Do smth. with "it" again
>
> commit = true;
> }

> Example 2:
>
> class A
> {
> int m_i;
>
> void foo()
> {
> m_i = 1;
> BOOST_SCOPE_EXIT((m_i))
> {
> // What's the value of m_i here?
> std::cout << m_i << std::endl;
> }
> BOOST_SCOPE_EXIT_END
>
> bar();
> }

I believe BOOST_SCOPE_EXIT should be moved to the end of foo(). I am
thinking about BOOST_SCOPE_EXIT as of try/finally with different layout
of braces:

void baz()
{ // 0
   try
   { // 1
       foo();
   } // 2
   finally
   { // 3
       bar();
   } // 4
} // 5

void baz()
{ // 0 and 1
   foo();

   BOOST_SCOPE_EXIT()
   { // 3
       bar();
   } // 4
   BOOST_SCOPE_EXIT_END
} // 5 and 2

> // Assume that bar's implementation is somewhere far away
> void bar();
> };
>
> These are just illustrations, I understand that I could have created
> copies of the needed variables on the stack. But I think this should
> be the default behavior of the library, and passing by reference
> should be an available option.

[snip]


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk