2013-10-18 12 views
6

私はオブジェクトにメモリを割り当て、そのコンストラクタ - メモリアロケータ - を呼び出すメソッドを持っています。バリデーションテンプレート関数への参照渡しと値渡しの組み合わせが有効ですか?

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

この関数を使用して値渡しと参照渡しを組み合わせることは有効ですか?たとえば、いくつかのバイナリといくつかの参照によってコンストラクタを持つクラスを割り当てます。それはコンパイルされますが、それが厄介な副作用を持っているかどうかはわかりません。

+1

は 'T(STD)が(argsを前方:: .. )、それ以外にもあなたは大丈夫でしょう。 – nijansen

答えて

5

あなたが探しているのは完全転送です。あなたのAllocateObject関数は、副作用をコピーする限り、完全に透過的でなければなりません。これは、両方のstd::forward関係(すでに述べたnijansenとして)とユニバーサル参照パラメータ・リスト中のの使用

:あなたはおそらく使用すべき

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

ええ、私は実際に '&&'を忘れてしまいました。完璧な転送のために重要です。) – nijansen

+0

Sidenote:ユニバーサルリファレンスは、今では "転送参照"に改名されました。 –

関連する問題