Kon*_*tin 3 c++ g++ compiler-warnings
在尝试编译以下代码时,我收到了一个非常奇怪的g ++警告:
#include <map>
#include <set>
class A {
public:
int x;
int y;
A(): x(0), y(0) {}
A(int xx, int yy): x(xx), y(yy) {}
bool operator< (const A &a) const {
return (x < a.x || (!(a.x < x) && y < a.y));
}
};
struct B {
std::set<A> data;
};
int
main()
{
std::map<int, B> m;
B b;
b.data.insert(A(1, 1));
b.data.insert(A(1, 2));
b.data.insert(A(2, 1));
m[1] = b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ g++ -Wall -W -O3 t.cpp -o /tmp/t
t.cpp: In function ‘int main()’:
t.cpp:14: warning: dereferencing pointer ‘__x.52’ does break strict-aliasing rules
t.cpp:14: warning: dereferencing pointer ‘__x.52’ does break strict-aliasing rules
/usr/lib/gcc/i686-redhat-linux/4.4.2/../../../../include/c++/4.4.2/bits/stl_tree.h:525: note: initialized from here
Run Code Online (Sandbox Code Playgroud)
对我来说根本没有任何意义.我该如何解读?我没有看到发布的代码有什么问题.
忘记指定编译器详细信息:
$ gcc --version
gcc (GCC) 4.4.2 20091027 (Red Hat 4.4.2-7)
Run Code Online (Sandbox Code Playgroud)
gcc 4.4有一个错误,其中std :: map 中断 错误警告严格别名规则.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39390
您的代码是有效的C++.严格别名仅允许在使用时默认启用的优化子集-O3.
您的解决方案是使用-fno-strict-aliasing或使用不同版本的gcc进行编译.
如果你对什么是严格的别名感到好奇,那就在这里问了.
| 归档时间: |
|
| 查看次数: |
707 次 |
| 最近记录: |