为什么std :: stof在传递参数时不会抛出它无法转换?

Tho*_*ell 3 c++ stl visual-c++

我正在开展一个项目,我想接受表单的输入{float}{single-letter-identifier},例如15.6E,或10W.

为此,我认为我可以取输入字符串,去除最后一个字母,然后检查是否可以执行转换以进行浮动,使用std::stof.这将嵌套在一个try-catch块中,并允许我通知用户无效输入.

在STL的开放标准在这里(页653)指出std::stof抛出:

invalid_argument 如果wcstod或wcstold报告无法执行转换.

但是,当传递无法转换的内容时,它不会抛出,例如"48East".重现此行为的代码示例如下:

std::wstring szString = L"48East";
try{
     float f = std::stof(szString);
} catch( ... )
{
     std::cout << "test" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这是在调试模式下在MSVC10上编译的/Od,所以我假设调用没有被优化掉.

我很感激任何帮助(或指导我误解/误读规范的地方!).

jwi*_*mar 6

在我阅读它时,stof尽可能多地转换输入字符串,直到它找到无法转换的内容.如果它无法转换它抛出的任何东西invalid_argument.

  • @Shaktal:您可以通过传入第二个参数来判断是否存在任何未转换的数据,该第二个参数将告诉您转换中未使用的第一个字符的索引:`std :: stof(szString,&some_size_t_var)`. (2认同)