2013-10-18 28 views
6

Bir nesne için bellek ayıran ve sonra kurucusunu (bellek ayırıcısı) çağıran bir yöntemim var.Referans ve geçiş değerlerini değişken şablona karıştırma işlevi geçerli mi?

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

Bu özellik, değer-değer-değer-ile-başvuru-referansını karıştırmak için geçerli midir? Örneğin, bir değere ve bazı referanslara sahip bir kurucu ile bir sınıf tahsis etmek. Derler ama herhangi bir kötü yan etkisi olup olmadığından emin değilim.

+1

'T (STD) (prmtr ileri :: .. .) Ama bunun yanında iyi olmalısın. – nijansen

cevap

5

Ne arıyorsunuz mükemmel iletme, yani. AllocateObject işlevinin, kopyalama yan etkileri söz konusu olduğunda tamamen şeffaf olması gerekir. Bu, hem std::forward kapsar (Daha önce bahsedildiği nijansen gibi) ve evrensel referanslar Parametreniz listesinde kullanımı

: Muhtemelen kullanmalısınız

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

Evet gerçekten unuttum '&&, bu mükemmel yönlendirme için önemli;) – nijansen

+0

Sidenote: Evrensel Referanslar şimdi" Referansları Aktar "olarak yeniden adlandırıldı. –

İlgili konular