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

  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007
  • How It Should Have Ended

    How It Shoul

    5 Mart 2007
  • UsherVEVO

    UsherVEVO

    15 EKİM 2009