Utilizzando Visual Studio 2010 SP1:Si tratta di un bug del compilatore VC++ 2010?
#include <vector>
//namespace XXX {
struct Test
{
bool operator==(const Test& r) const { return true; }
};
//}
//typedef XXX::Test Test;
template <typename T> inline bool operator!=(const T& l,const T& r)
{ return !(l==r); }
int main()
{
std::vector<Test> vt;
std::vector<Test> vt2 = std::move(vt);
return 0;
}
Se compilo il codice di cui sopra come è, non riesce con questo errore:
1>C:\apps\MVS10\VC\include\vector(609): error C2593: 'operator !=' is ambiguous
1> C:\apps\MVS10\VC\include\xmemory(268): could be 'bool std::operator !=<_Ty,_Ty>(const std::allocator<_Ty> &,const std::allocator<_Ty> &) throw()'
1> with
1> [
1> _Ty=Test
1> ]
1> test.cpp(11): or 'bool operator !=<std::allocator<_Ty>>(const T &,const T &)' [found using argument-dependent lookup]
1> with
1> [
1> _Ty=Test,
1> T=std::allocator<Test>
1> ]
1> while trying to match the argument list '(std::allocator<_Ty>, std::allocator<_Ty>)'
1> with
1> [
1> _Ty=Test
1> ]
1> C:\apps\MVS10\VC\include\vector(606) : while compiling class template member function 'void std::vector<_Ty>::_Assign_rv(std::vector<_Ty> &&)'
1> with
1> [
1> _Ty=Test
1> ]
... dove vector(609)
risolve a questa linea:
else if (get_allocator() != _Right.get_allocator())
OTOH, se rimedio alle righe correlate a namespace XXX
, si compila senza reclami.
Devo pensare che questo sia un errore del compilatore ma sto cercando qualche verifica indipendente.
EDIT: Solo a titolo di spiegazione, mi sono imbattuto in questa situazione quando ho ricompilato il vecchio codice con VS2010 per la prima volta. L'operatore globale era un po 'cruft degli anni passati (ora rimosso). Non riuscivo a capire perché alcuni codici fallivano e altri no. Il codice sopra è la mia distillazione del caso fallito (ovviamente, il vecchio codice non conterrebbe le chiamate a std::move()
).
UPDATE: mi sono collegato un bug con la SM e mi hanno risposto che questo è stato fissato "nella prossima versione del compilatore" - che presumo significa Visual C++ 11. Vedere: http://connect.microsoft.com/VisualStudio/feedback/details/731692/regression-involving-global-operator-and-std-vector
Hai provato questo con un compilatore diverso? –
@GregHewgill: non riesco a riprodurre con GCC. – mcmcc
@GregHewgill: ho mentito nel mio precedente commento, non ho un altro compilatore a portata di mano che supporti C++ 11, quindi la risposta è no. – mcmcc