2016-07-05 12 views
23

stl_construct.h có chức năng sau:Ưu điểm con trỏ cast void * khi sử dụng mới

template<typename _T1, typename _T2> 
inline void 
_Construct(_T1* __p, const _T2& __value) 
{ 
    ::new(static_cast<void*>(__p)) _T1(__value); 
} 

Tôi muốn biết lý do tại sao đúc __p để void* là cần thiết, là có bất kỳ lợi thế?

+3

Không chắc chắn, nhưng nó khẳng định '__p' là một con trỏ có thể được sử dụng cho vị trí? –

+9

Nguy cơ đọc mã thư viện nội bộ mà tôi gặp phải là lập trình viên (mới) bắt đầu * sử dụng * nội bộ trong mã riêng của họ (không tôi không nói đùa - tôi đã thấy điều này trong một số mã). – PaulMcKenzie

Trả lời

24

Nó đảm bảo rằng vị trí điều hành mới được xác định trước được gọi là, chứ không phải bất kỳ tình trạng quá tải thêm vào không gian tên toàn cầu bằng cách mã người dùng với chữ ký void* operator new(std::size_t, _T1*) .

3

Nó đảm bảo một khả năng _T1 * điều hành dàn diễn viên không được unitentionally thực hiện

+1

Bạn có thể cung cấp một ví dụ đơn giản về thời điểm điều này xảy ra không? Điều này trông giống như một cấu trúc vị trí, do đó con trỏ phải có cùng một liên kết như bộ đệm, thường là 'alignof (char */void *)'. – vsoftco

+0

Trong trường hợp câu trả lời của Brian, chỉ có * tìm thấy * một quá tải 'mới' thông qua chuyển đổi ngầm, thay vì một được cung cấp cho loại đó. –

2

Đảm bảo rằng bất kỳ void* operator new(size_t, _T1*); nào cũng không cản trở vị trí mới mà nó đang cố gắng thực hiện.

Các vấn đề liên quan