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.
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? –
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. –
Çok güzel bir açıklama, teşekkür ederim. – user2023370