Использование Visual Studio 2010 SP1:
#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;
}
Если я скомпилирую приведенный выше код как есть, произойдет сбой с этой ошибкой:
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> ]
... где vector(609)
разрешается в этой строке:
else if (get_allocator() != _Right.get_allocator())
OTOH, если я раскомментирую строки, связанные с namespace XXX
, он компилируется без жалоб.
Я должен думать, что это ошибка компилятора, но мне нужна независимая проверка.
РЕДАКТИРОВАТЬ: Просто для пояснения я столкнулся с этой ситуацией, когда впервые перекомпилировал старый код с VS2010. Глобальный оператор был чем-то напрасным из прошлых лет (теперь удален). Я просто не мог понять, почему некоторые коды не работают, а другие нет. Приведенный выше код - это мой пример неудачного случая (очевидно, что старый код не будет содержать вызовов std::move()
).
ОБНОВЛЕНИЕ: Я зарегистрировал ошибку в MS, и они ответили, что это исправлено «в следующем выпуске компилятора» - что, я полагаю, означает Visual C ++ 11. См .: http://connect.microsoft.com/VisualStudio/feedback/details/731692/regression-involving-global-operator-and-std-vector