je le bit de code suivant:Essayer de comprendre une erreur de GCC
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
template<typename Iterator>
void foo(Iterator begin, Iterator end)
{
typedef typename std::iterator_traits<Iterator>::value_type type;
type smallest = (*std::min_element(begin,end));
std::cout << smallest << std::endl;
}
int main()
{
std::list<int> l;
l.push_back(1);
l.push_back(2);
foo(l.begin(),l.end());
return 0;
}
quand je compile comme suit:
g++ -pedantic -ansi -Wall -Werror -O2 -o test test.cpp
Je reçois l'erreur suivante:
cc1plus: warnings being treated as errors
In function ‘int main()’:
cc1plus: error: dereferencing pointer ‘pretmp.163’ does break strict-aliasing rules
cc1plus: note: initialized from here
Cette erreur est vue avec O3, mais pas avec O1. J'ai compilé le code en utilisant le compilateur en ligne comeau, MS VC9.0 et icc v11 et dans tous les cas, le code compile sans problème.
Le code fonctionne très bien avec std::vector
, std::deque
, std::set
, char*
, int*
itérateurs, semble être quelque chose de très spécifique à la mise en œuvre de std :: liste.
J'espérais que quelqu'un pourrait donner un aperçu de ce que cette erreur particulière (avertissement) signifie et comment s'y prendre pour le résoudre.
Note: La version de GCC est:
gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Impossible de le reproduire avec g ++ 4.3.3 sous Linux ... – sth
Je ne le vois pas avec Apple ++. Quel système d'exploitation est-ce? J'ai tendance à penser que votre version du STL aura de l'importance. –