У меня есть несколько не копируемых классов. Я не вызываю ни один из операторов копирования или конструктор, и этот код компилируется нормально. Но затем я обновился до Visual Studio 2010 Ultimate вместо Professional. Теперь компилятор вызывает конструктор копирования - даже когда должен быть вызван конструктор перемещения. Например, в следующем фрагменте:
inline D3D9Mesh CreateSphere(D3D9Render& render, float radius, float slices) {
D3D9Mesh retval(render);
/* ... */
return std::move(retval);
}
Ошибка: невозможно создать конструктор копирования, так как класс не подлежит копированию. Тем не менее, я совершенно явно переместил его.
Edit:
class D3D9Mesh
: public Monitor<D3D9Mesh>
{
public:
std::unique_ptr<ID3DXMesh, COMDeleter> Mesh;
std::unique_ptr<ID3DXBuffer, COMDeleter> Adjacency;
inline D3D9Mesh(D3D9Render& ref)
: Monitor<D3D9Mesh>(&ref)
{
}
};
где Monitor - это простой класс, который можно копировать / etc. Это unique_ptrs, явно не кошерный для компилятора.
Код монитора:
class D3DCommon {};
template<typename T> class Monitor : public D3DCommon {
protected:
D3D9Render* render;
Monitor(D3D9Render* ptr)
: render(ptr) {
render->AddPointer(static_cast<T*>(this));
}
Monitor(Monitor&& ref) {
render->AddPointer(static_cast<T*>(this));
}
Monitor(const Monitor& ref) {
render->AddPointer(static_cast<T*>(this));
}
~Monitor() {
render->RemovePointer(static_cast<T*>(this));
}
public:
D3D9Render& GetRender() {
return *render;
}
};