这是编译器错误还是我的代码?

Is this a compiler bug or it's my code?

本文关键字:代码 我的 错误 编译器      更新时间:2023-10-16

下面是一个示例代码:

#include <iostream>
#include <stdexcept>
#include <cstring>
#include <ctime>
#include <sstream>
using std::cout;
using std::endl;
std::size_t const BUF_SIZE(1000);
std::ostream& operator<<(std::ostream& os, std::tm const& rhs)
{   
    os << asctime(&rhs);
    return os; 
}   
std::istream& operator>>(std::istream& is, std::tm& rhs)
{   
    while (is.peek() == ' ' || is.peek() == 't')
    {   
        is.get();
    }   
    std::streampos curPos = is.tellg();
    char buf[BUF_SIZE];
    is.getline(buf, BUF_SIZE);
    char* ptr = strptime(buf, "%D %T", &rhs);
    if (ptr == 0)
    {   
        throw std::runtime_error("strptime() failed!");
    }   
    std::size_t processed = ptr - buf;
    is.seekg(curPos + static_cast<std::streampos>(processed));
    return is; 
}   
int main()
{   
    std::istringstream is("10101 07/09/12 07:30:00 123.24");
    int uuid(0);
    double price(0);
    std::tm ptime; std::memset(&ptime, 0, sizeof(tm));
    is >> uuid >> ptime >> price;
    cout << "UUID: " << uuid << endl;
    cout << "Time: " << ptime;
    cout << "Price: " << price << endl;
} 

我试图重载结构 tm 的<<和>>运算符的地方!如果我使用 g++ 编译代码并运行它,我会得到:

UUID: 10101
Time: Sun Jul  9 07:30:00 2012
Price: 123.24

完善!

但是,如果我使用 clang++ 编译它,我会得到:

UUID: 10101
Time: Sun Jul  9 07:30:00 2012
Price: 0

哎呀!

这是怎么回事? 这是 Clang 的问题还是我处理 istream 的方式?

我能够重现这个(使用 libc++-svn 的 g++ 4.7.0 和 clang++ 3.1),一个简短的调试会话表明 clang++ 在 getline 之后设置eofbit(这是正常的),然后以某种方式导致seekg设置failbit。这听起来像是一个错误,因为 seekg first clears eofbit (§27.7.2.3/41)

若要变通方法,请在getlineseekg之间的任何位置插入is.clear()

相关文章: