Tạo một đối tượng mới của lớp C với toán tử new () gây ra lỗi ở đây:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
với C2280: 'void C::operator delete(void *)': function was explicitly deleted
Nhưng khi tôi thay thế C() {}
bằng C() = default;
hoặc loại bỏ dòng để trình biên dịch chèn một hàm tạo mặc định (mà tôi tin là có tác dụng tương tự = default
), mã sẽ biên dịch và chạy.
Sự khác biệt giữa hàm tạo mặc định do trình biên dịch tạo và hàm tạo mặc định do người dùng định nghĩa làm cho điều này xảy ra là gì?
Tôi có một số gợi ý trong bài đăng này , nhưng lớp C ở đây (không có hàm tạo do người dùng cung cấp) không tầm thường vì hàm hủy là ảo, phải không?
Được biên dịch với Visual Studio mới nhất, c ++ 17.
operator delete()
việc liệu constructor được viết thủ công hay được tạo ngầm. Điều này phù hợp với mong đợi của tôi - vì một ngoại lệ có thể bị ném bởi new
biểu thức, trình biên dịch cần truy cập operator delete()
.
noexcept
sẽ làm cho mã được biên dịch, nhưng làm thế nào ...?
noexcept
như SebastianRedl đã đề cập, thì operator delete
không cần phải bao gồm một cuộc gọi . Ngoài ra g ++ không phàn nàn nếu hàm hủy là ảo. Mặt khác, nó luôn luôn biên dịch, ngay cả khi hàm tạo đang ném.
noexcept