Это очень простой вопрос. Рассмотрим следующий код:
#include <iostream>
#include <memory>
typedef std::unique_ptr<void> UniqueVoidPtr;
int main() {
UniqueVoidPtr p(new int);
return 0;
}
Компиляция с cygwin (g++ 4.5.3) с помощью следующей команды g++ -std=c++0x -o prog file.cpp
работает отлично. Однако компиляция с помощью компилятора microsoft (VS 2010 или 2013), я получаю эту ошибку:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\memory(2067) : error C2070: 'void': illegal sizeof operand
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\memory(2066) : while compiling class template member function 'void std::default_delete<_Ty>::operator ()(_Ty *) const'
with
[
_Ty=void
]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\type_traits(650) : see reference to class template instantiation 'std::default_delete<_Ty>' being compiled
with
[
_Ty=void
]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\memory(2193) : see reference to class template instantiation 'std::tr1::is_empty<_Ty>' being compiled
with
[
_Ty=std::default_delete<void>
]
foo1.cpp(7) : see reference to class template instantiation 'std::unique_ptr<_Ty>' being compiled
with
[
_Ty=void
]
Ожидается ли это? Я пишу класс, где я хотел иметь уникальный указатель в классе. При попытке выработать семантику конструктора перемещения для класса я столкнулся с этим (я предполагаю, потому что я, наконец, правильно закодировал свой конструктор перемещения, т.е. Другие ошибки были исправлены).