Std::forward ileri bir tartışma oldu mu?
C 0 x std kullanarak bir örnek gösterir::ileri:
template<class T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
Ne zaman std kullanmak avantajlı mı::ileri, her zaman?
Ayrıca, & & parametreleri bildirimi kullanmak gerekir, bu her durumda geçerli mi? Eğer işlevi içinde && ile bildirilmiş bir işlev geçici geçirmek için olduğunu sanıyordum, yani foo herhangi bir parametre ile çağrılabilir?
Eğer bu gibi bir işlev çağrısı var Son olarak, eğer
template<int val, typename... Params>
void doSomething(Params... args) {
doSomethingElse<val, Params...>(args...);
}
Bunun yerine kullanılır:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
Eğer parametreleri iki kez işlevi, yani iki iletme fonksiyonları için kullanıyorsa da, aynı zamanda, std kullanmak akıllıca::ileri? Std olmaz::ileri bir geçici iki kez aynı şeyi dönüştürmek, bellek, hareket ve ikinci bir kullanım için geçersiz hale getirmek? Aşağıdaki kodu Tamam olur:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Biraz std biraz kafam karıştı::: istek ve memnuniyetle bazı takas kullanırdım.
CEVAP
İlk örnekte olduğu gibi kullanabilirsiniz:
template <typename T> void f(T && x)
{
g(std::forward<T>(x));
}
template <typename ...Args> void f(Args && ...args)
{
g(std::forward<Args>(args)...);
}
Bu nedenle reference collapsing rules: T = U&
T&& = U&
ama T = U&&
T&& = U&&
, Bu yüzden her zaman sonuna kadar doğru tip içinde işlevi vücudun. Son olarak, forward
lvalue-açık x
(bir adı var çünkü!) açmak gerekir eğer bir başlangıçta olsa rvalue başvurusunu geri.
Çünkü çok mantıksız ileri bir şey bir kez daha, ama olamaz. İletme potansiyel demektirhareketlitartışma tüm yol arayan en son kişi aracılığıyla, ve taşındıktan sonra yeniden kullanamazsınız Bu yüzden gitti.
Neden oldu bu tartışmalar.aranan.araya...
raylar HATA gem yükleyin: libv8 yüklem...
EC2, Amazon mysql iptal başlamak çünkü...
Böyle büyük mükafat 5 - "iOS Simü...
Android Emülatörü: seçim çekmek için B...