2013-10-18 19 views
6

Tôi có một phương pháp phân bổ bộ nhớ cho một đối tượng và sau đó gọi hàm khởi tạo của nó - một bộ cấp phát bộ nhớ.Trộn pass-by-reference và pass-by-value cho hàm mẫu variadic hợp lệ?

template <class T, typename... Arguments> 
inline T* AllocateObject(Arguments... args) { return new (InternalAllocate(sizeof(T))) T(args...); } 

Có hợp lệ khi sử dụng chức năng này để trộn lẫn giá trị và tham chiếu không? Ví dụ, phân bổ một lớp với một hàm tạo với một số giá trị và một số tham chiếu. Nó biên dịch, nhưng tôi không chắc nó có tác dụng phụ khó chịu hay không.

+1

Bạn có lẽ nên sử dụng 'T (std :: mong (args) .. .) ', nhưng bên cạnh đó bạn nên ổn. – nijansen

Trả lời

5

Điều bạn đang tìm kiếm là chuyển tiếp hoàn hảo, tức là. chức năng AllocateObject của bạn phải hoàn toàn minh bạch khi có liên quan đến các tác dụng phụ sao chép.

này liên quan đến cả hai std::forward (như nijansen đã đề cập) và việc sử dụng các tài liệu tham khảo phổ trong danh sách tham số của bạn:

template <class T, typename... Arguments> 
inline T* AllocateObject(Arguments&&... args) 
//        ^^ universal references 
{ 
    return new (InternalAllocate(sizeof(T))) T(std::forward<Arguments>(args)...); 
    //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ forwarding 
} 
+0

Vâng tôi đã thực sự quên '&&', đó là loại quan trọng để chuyển tiếp hoàn hảo;) – nijansen

+0

Sidenote: Universal Tài liệu tham khảo đã được đổi tên thành "Chuyển tiếp tham khảo" bây giờ. –

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