2011-04-01 22 views

cevap

18

identity amacı T olmayan deducible yapmaktı: Neden olmasın. Yani, istemciyi forward numaralı telefonu arayarak T tedarik etmeye zorlamak. şablon parametresi istemci ya bir lvalue veya bir rvalue olarak argüman ileri derleyici söyler hangi anahtarı olduğu için bu gereklidir

forward(a);  // compile-time error 
forward<A>(a); // ok 

nedenidir. Yanlışlıkla bu bilgileri sağlamayı unutursanız, lvalues ​​her zaman lvalues ​​olarak döndürülür ve rvalues ​​daima rvalues ​​olarak döndürülür. İlk başta istediğin gibi gelebilir, gerçekten değil. Yukarıdaki örnekte a1 olarak

template <class T, class A1> 
std::shared_ptr<T> 
factory(A1&& a1) 
{ 
    return std::shared_ptr<T>(new T(std::forward<A1>(a1))); 
} 

her zaman lvalue olup. Ancak "anahtar" A1, bir değer referansı olabilir veya olmayabilir. Bir lvalue referansı ise, a1 bir değer olarak iade edilir, aksi takdirde a1 bir değer olarak döndürülür. Fabrika yazarı yanlışlıkla A1 tedarik etmeyi unutursa, identity kullanımı derleme zamanında onu hatırlatır.

Not: Son taslak identity'dan yoksundur, ancak aynı amaçla remove_reference kullanır.

+0

Bu sorunun cevabımdan daha iyi açıklandığını düşünüyorum, bu yüzden benimkini sildim. Hala 'forward' için bir rengin argümanını ilettiğiniz iyi bir örnek olup olmadığını merak ediyorum. Herhangi bir usecase var mı? Belki de Standart kütüphanede? –

+0

Bkz: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2951.html. Bu yazının eninde sonunda sorunlu olduğu ileri sürülen bir uygulama önermektedir. Bununla birlikte, nihai ileri şartname bu belgede sunulan tüm kullanım örneklerini geçer ve doğru bir şekilde başarısız olur. İşte N2951'in kaçırdığı son kullanım durumunu gösteren http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3143.html. –

+0

Çok güzel bir açıklama, teşekkür ederim. – user2023370

İlgili konular