'stol'使用Visual Studio但不是gcc抛出的异常

ksl*_*ksl 4 c++ exception c++11 visual-studio-2013 gcc4.9

以下代码在Visual Studio 2013下运行但不是gcc 4.9.2时会引发异常.

报告的错误是:

'例外:stol争论超出范围'

stol返回一个long大小temp应该足够大以保存返回值.

谁能解释这种行为.这可能是编译器错误吗?

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

int main()
{
    const std::string value = "4294967295";   // 0xffffffff

    try
    {
        int64_t temp = std::stol(value);
    }

    catch (std::invalid_argument& ex)
    {
        std::cout << "invalid_argument: " << ex.what() << "\n";
    }

    catch (std::exception& ex)
    {
        std::cout << "exception: " << ex.what() << "\n";
    }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

MSa*_*ers 5

我的赌注是long视觉工作室上的32位(最大2 ^ 31,因此溢出)和longGCC上的64位(因此无处可靠溢出).


Ros*_*dge 5

在Windows下,类型long始终为32位.由于long是有符号整数类型,这意味着范围long介于-2147483648和2147483647之间.在Linux上,大小long取决于您是编译32位还是64位.

由于std:stol将字符串转换为long结果必须符合a long.如果没有则函数抛出std::out_of_range.要解决此问题,您可以使用std::stoll哪个返回a long long,保证至少为64位,因此在转换时不会抛出异常"4294967295".您也可以使用std::stoul,转换为a unsigned long,保证范围至少为0到4294967295.

(请注意,这不是严格意义上的Visual C++与GCC的对比.当针对Windows时,GCC也总是使用32位long.)