2

ケースを以下に示すコードに減らしました。コンパイルすると、次のようになります。

$ g++  -std=c++0x -O2 -Wall t.cpp
t.cpp: In function ‘int main()’:
t.cpp:20: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
t.cpp:19: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h:175: note: initialized from here

この警告は私に何を伝えていますか?私はそれについて何ができますか?

#include <stdio.h>
#include <stdint.h>
struct TimeKey {

    uint64_t time_stamp;
    uint64_t msg_no;

    TimeKey(uint64_t tstamp, uint64_t no) :
        time_stamp(tstamp),
        msg_no(no)
    {}  

    bool operator < (const TimeKey &other) const 
    {   
        if (time_stamp == other.time_stamp)  //line 19
            return msg_no < other.msg_no;    //line 20
        else
            return time_stamp < other.time_stamp;
    }   
};

template <typename T>
class TimeBuffer {
public:
    uint64_t counter;
    std::map<TimeKey, T> messages;
    void AddMsg(uint64_t tstamp, T val) {
        messages[TimeKey(tstamp, counter++)] = val;
     }   
};  

int main(void)
{
    TimeBuffer<int> messages;
    messages.AddMsg(123456, 1); 
}

これは、gcc4.4.6に付属しているRHEL6.3にあることに注意してください。

4

1 に答える 1

3

これは既知の(そして修正された)コンパイラのバグです。これこれを参照してください。ツールチェーンを更新する必要があります。

于 2013-03-20T12:08:29.073 に答える