SORU
31 AĞUSTOS 2011, ÇARŞAMBA


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
31 AĞUSTOS 2011, ÇARŞAMBA


İ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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • FASHTAG

    FASHTAG

    5 EYLÜL 2012
  • Hot For Nutrition

    Hot For Nutr

    26 ŞUBAT 2007