我们可以通过实体化样板类 reference_wrapper
得到一个包装引用 (wrapper reference)。包装引用类似于一般的引用。对于任意对象,我们可以通过模板类 ref
得到一个包装引用 (至于 constant reference 则可通过 cref
得到)。
当样板函数需要形参的引用而非其拷贝,这时包装引用就能派上用场:
// 此函數將得到形參 'r' 的引用並對 r 加一 void f (int &r) { r++; } // 樣板函式 template<class F, class P> void g (F f, P t) { f(t); } int main() { int i = 0 ; g (f, i) ; // 實體化 'g<void (int &r), int>' // 'i' 不會被修改 std::cout << i << std::endl; // 輸出 0 g (f, std::ref(i)); // 實體化 'g<void(int &r),reference_wrapper<int>>' // 'i' 會被修改 std::cout << i << std::endl; // 輸出 1 }
这项功能将加入头文件 <utility>
之中,而非通过扩展语言来得到这项功能。