>From: "David Abrahams" <[EMAIL PROTECTED]>

> Terje Slettebų <[EMAIL PROTECTED]> writes:
>
> >> C:\Program Files\Boost\boost_1_30_0\boost/lexical_cast.hpp(74) :
warning
> > C4512: 'no_lexical_conversion<class std::basic_string<char,struct
> > std::char_traits<char>,class std::allocator<char> >,long>' : assignment
> > operator could not be generated
> >
> > This is due to that it stores a const std::string object, describing the
> > exception
>
> Are you saying that you have defined an exception with a std::string
> member?  That's VERY bad!  Throwing that exception can lead directly
> to termination!

You mean if the exception itself throws during construction or copying?

I've tried the program below on Intel C++ 7.0 and MSVC 6, and I haven't got
it to call terminate(). It may be that it doesn't handle exceptions
correctly, though.

#include <iostream>
#include <string>
#include <stdexcept>

class Exception : public std::runtime_error
{
public:
  Exception() : std::runtime_error("Exception")
    { throw std::runtime_error("Construction"); }

  Exception(const Exception &) : std::runtime_error("Exception (copied)")
    { throw std::runtime_error("Copy"); }
};

int main()
{
  try
  {
    throw Exception();
  }
  catch(const std::exception &e)
  {
    std::cout << "Exception - " << e.what() << '\n';
  }
  catch(...)
  {
    std::cout << "Unknown exception\n";
  }
}

As it stands, it prints "Exception - Constructor", as it throws an exception
in the constructor of the Exception exception. If the throw-statement in the
constructor is commented out, it prints "Exception - Exception", apparently
not invoking the copy constructor when throwing the exception (which it's
allowed to).

> What's wrong with char const*?

You mean storing the string as a character array? Sure, that's possible, and
I see that STLPort do it, and it's probably safer, as you say. It does mean
you have to specify the maximum string length in advance, though. As
"no_lexical_conversion" what() prints out the source and target types, it
may truncate long type names.


Regards,

Terje

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

Reply via email to