some "rewording" to avoid spurious level 4 warnings with VC7.1 and VC8

[SVN r34801]
This commit is contained in:
Gennaro Prota
2006-08-01 22:37:38 +00:00
parent e6c83d0665
commit c5bc634015

View File

@@ -136,10 +136,21 @@ namespace boost
{ {
stream.unsetf(std::ios::skipws); stream.unsetf(std::ios::skipws);
if(std::numeric_limits<Target>::is_specialized) // The odd style used below is to avoid spurious compiler
stream.precision(std::numeric_limits<Target>::digits10 + 1); // warnings about using is_specialized as a (constant)
else if(std::numeric_limits<Source>::is_specialized) // conditional expression
stream.precision(std::numeric_limits<Source>::digits10 + 1);
typedef std::numeric_limits<Target> t;
typedef std::numeric_limits<Source> 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() ~lexical_stream()
{ {
@@ -215,13 +226,27 @@ namespace boost
Target lexical_cast( Target lexical_cast(
BOOST_DEDUCED_TYPENAME boost::call_traits<Source>::value_type arg) BOOST_DEDUCED_TYPENAME boost::call_traits<Source>::value_type arg)
{ {
detail::lexical_stream<Target, Source> interpreter;
Target result;
if(!(interpreter << arg && interpreter >> result)) detail::lexical_stream<Target, Source> interpreter;
throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
// 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; return result;
} }
throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
return Target(); // never reached
}
} }
template<typename Target, typename Source> template<typename Target, typename Source>