new () 연산자를 사용하여 클래스 C의 새 객체를 만들면 여기에 오류가 발생합니다.
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
와 C2280: 'void C::operator delete(void *)': function was explicitly deleted
내가 바꿀 때 C() {}
와 C() = default;
또는 컴파일러 (내가 가진 동일한 효과를 가지고 있다고 생각합니다 기본 생성자를 삽입하도록 줄을 제거 = default
), 코드는 컴파일하고 실행합니다.
컴파일러 생성 기본 생성자와 사용자 정의 기본 생성자의 차이점은 무엇입니까?
이 게시물에 힌트가 있지만 소멸자가 가상이기 때문에 여기에 C 클래스 (사용자 제공 생성자 없음)가 사소하지 않습니다.
최신 Visual Studio C ++ 17로 컴파일되었습니다.
operator delete()
생성자가 수동으로 작성되는지 암시 적으로 생성되는지에 관한 유사한 진단 . new
식에 의해 예외가 발생할 수 있으므로 컴파일러가 액세스해야합니다 operator delete()
.
noexcept
하면 코드가 컴파일되지만 어떻게 ...?
noexcept
SebastianRedl에서 언급 한 경우 호출을 operator delete
포함 할 필요가 없습니다. 또한 g ++은 소멸자가 가상 인 경우에만 불평합니다. 그렇지 않으면 생성자가 던지더라도 항상 컴파일됩니다.
noexcept