Это странность, где я не знаю, если это со стандартом С++, с моим компилятором (g++ версия 4.6.3 на Ubuntu 12.04, которая является последней версией долгосрочной поддержки Ubuntu) или с меня, который не понимает; -)
Указанный код так же прост:
#include <algorithm> // for std::swap
void f(void)
{
class MyClass { };
MyClass aa, bb;
std::swap(aa, bb); // doesn't compile
}
При попытке компиляции с g++ компилятор выводит следующее сообщение об ошибке:
test.cpp: In function ‘void f()’:
test.cpp:6:21: error: no matching function for call to ‘swap(f()::MyClass&, f()::MyClass&)’
test.cpp:6:21: note: candidates are:
/usr/include/c++/4.6/bits/move.h:122:5: note: template<class _Tp> void std::swap(_Tp&, _Tp&)
/usr/include/c++/4.6/bits/move.h:136:5: note: template<class _Tp, long unsigned int _Nm> void std::swap(_Tp (&)[_Nm], _Tp (&)[_Nm])
Удивительный результат заключается в том, что простое перемещение определения класса из функции делает этот код компилируемым штрафом:
#include <algorithm> // for std::swap
class MyClass { };
void f(void)
{
MyClass aa, bb;
std::swap(aa, bb); // compiles fine!
}
Итак, std:: swap() не должен работать над классами, которые являются частными для функций? Или это ошибка с g++, может быть, конкретная версия g++, которую я использую?
Еще более озадачивающим является то, что следующее работает снова, несмотря на то, что MyListClass также является приватным (но расширяет "официальный" класс, для которого может существовать определенная реализация swap()):
#include <algorithm> // for std::swap
#include <list> // for std::list
void g(void)
{
class MyListClass : public std::list<int> { };
MyListClass aa, bb;
std::swap(aa, bb); // compiles fine!
}
Но просто переходите от объектов к указателям, а компиляция снова завершается:
#include <algorithm> // for std::swap
#include <list> // for std::list
void g(void)
{
class MyListClass : public std::list<int> { };
MyListClass aa, bb;
MyListClass* aap = &aa;
MyListClass* bbp = &bb;
std::swap(aap, bbp); // doesn't compile!
}
Конечно, в моем реальном приложении классы более сложны; Я упростил код как можно больше, чтобы воспроизвести проблему.