diff --git a/include/boost/lexical_cast.hpp b/include/boost/lexical_cast.hpp index 28258fe..bb45719 100644 --- a/include/boost/lexical_cast.hpp +++ b/include/boost/lexical_cast.hpp @@ -136,10 +136,21 @@ namespace boost { stream.unsetf(std::ios::skipws); - if(std::numeric_limits::is_specialized) - stream.precision(std::numeric_limits::digits10 + 1); - else if(std::numeric_limits::is_specialized) - stream.precision(std::numeric_limits::digits10 + 1); + // The odd style used below is to avoid spurious compiler + // warnings about using is_specialized as a (constant) + // conditional expression + + typedef std::numeric_limits t; + typedef std::numeric_limits s; + + bool setup_target = t::is_specialized; + if (setup_target) + stream.precision(t::digits10 + 1); + else + ((s::is_specialized) && + stream.precision(s::digits10 + 1)); + + } ~lexical_stream() { @@ -215,12 +226,26 @@ namespace boost Target lexical_cast( BOOST_DEDUCED_TYPENAME boost::call_traits::value_type arg) { - detail::lexical_stream interpreter; - Target result; - if(!(interpreter << arg && interpreter >> result)) - throw_exception(bad_lexical_cast(typeid(Source), typeid(Target))); - return result; + detail::lexical_stream interpreter; + + // The original form, reproduced below, is more elegant + // but yields a spurious C4701 warning ("possible use of + // "result" before initialization") with VC7.1 (/W4). +// +// Target result; +// +// if(!(interpreter << arg && interpreter >> result)) +// throw_exception(bad_lexical_cast(typeid(Source), typeid(Target))); +// return result; + + if(interpreter << arg) { + Target result; + if (interpreter >> result) + return result; + } + throw_exception(bad_lexical_cast(typeid(Source), typeid(Target))); + return Target(); // never reached } }