我继承了一个将字符串转换为数值的模板,并希望将其应用于转换为boolean。我对 stringstream 和 locale 类不是很有经验。我似乎确实有一些奇怪的行为,我想知道是否有人可以向我解释一下?
template<typename T> T convertFromString( const string& str ) const {
std::stringstream SStream( str );
T num = 0;
SStream >> num;
return num;
}
这工作正常,直到我尝试布尔转换
string str1("1");
int val1 = convertFromString<int>(str1); // ok
string str2("true");
bool val2 = convertFromString<bool>(str2); // val2 is _false_
我花了一些时间来追踪问题。我已确认语言环境的 truename() 返回“true”。
问题似乎与变量num的初始化有关。我可以将模板更改为此并且它可以工作:
template<typename T> T convertFromString( const string& str ) const {
std::stringstream SStream( str );
T num; // <----------------------- Changed here
SStream >> num;
return num;
}
string str2("true");
bool val2 = convertFromString<bool>(str2); // val2 is _true_
为什么它有效?我接受用 '0' 初始化 bool 是错误的,但是为什么这会导致SStream>>num
转换失败?