Является ли это ошибкой компилятора VC++2010?

Использование Visual Studio 2010 SP1:

#include 

//namespace XXX {
  struct Test
  {
    bool operator==(const Test& r) const  { return true; }
  };
//}
//typedef XXX::Test Test;

template  inline bool operator!=(const T& l,const T& r) 
{ return !(l==r); }

int main()
{
  std::vector vt;
  std::vector vt2 = std::move(vt);
  return 0;
}

Если я скомпилирую приведенный выше код как есть, произойдет сбой с этой ошибкой:

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 !=>(const T &,const T &)' [found using argument-dependent lookup]
1>          with
1>          [
1>              _Ty=Test,
1>              T=std::allocator
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>          ]

... где vector(609)разрешается в эту строку:

        else if (get_allocator() != _Right.get_allocator())

OTOH, если я раскомментирую строки, связанные с пространством имен XXX, он компилируется без проблем.

Я должен думать, что это ошибка компилятора, но я ищу независимую проверку.

РЕДАКТИРОВАТЬ:Просто в качестве объяснения, я столкнулся с этой ситуацией, когда впервые перекомпилировал какой-то старый код с VS2010. Глобальный оператор был каким-то мусором прошлых лет (сейчас удален). Я просто не мог понять, почему один код не работает, а другой нет. Приведенный выше код — это моя дистилляция неудачного случая (очевидно, что старый код не будет содержать вызовов std::move()).

ОБНОВЛЕНИЕ: Я зарегистрировал ошибку в MS, и они ответили, что она была исправлена ​​«в следующем выпуске компилятора», что, как я полагаю, означает Visual C++ 11. См.: http://connect .microsoft.com/VisualStudio/feedback/details/731692/regression-involving-global-operator-and-std-vector

6
задан James McNellis 22 March 2012 в 07:17
поделиться