Std arasındaki fark::ne hareket ve std::forward | Netgez.com
SORU
12 Mart 2012, PAZARTESÄ°


Std arasındaki fark::ne hareket ve std::forward

Bu burada gördüm: Move Constructor calling base-class Move Constructor

Birisi açıklayabilir:

  1. std::move std::forward tercihen bazı kod örnekleri ile arasındaki fark nedir?
  2. Bu konuda kolayca düşünmeye nasıl ve ne zaman kullanılır

CEVAP
15 Mart 2012, PERÅžEMBE


std::move bir nesneyi alır ve onu geçici olarak (bir rvalue) tedavi etmek için izin verir. Semantik bir gereklilik olmasa da, genellikle bir işlev bir rvalue başvurusu kabul geçersiz hale gelecektir. std::move, gördüğünüzde nesnesinin değerini sonradan kullanılması gerektiği anlamına gelir, ama yine de yeni bir değer atamak ve kullanmaya devam edebilirsiniz.

std::forward tek kullanımlık bir durum var: değer kategorisi (lvalue veya rvalue) için arayan geçmek için kullanılır. şablon fonksiyon bir parametre (fonksiyon içinde) döküm Bu rvalue argümanlar rvalues olarak geçmesini sağlar ve lvalues olarak geçirilen lvalues, bir düzeni "mükemmel iletme." denir

9* *için:

void overloaded( int const &arg ) { std::cout << "by lvalue\n"; }
void overloaded( int && arg ) { std::cout << "by rvalue\n"; }

template< typename t >
/* "t &&" with "t" being template param is special, and  adjusts "t" to be
   (for example) "int &" or non-ref "int" so std::forward knows what to do. */
void forwarding( t && arg ) {
    std::cout << "via std::forward: ";
    overloaded( std::forward< t >( arg ) );
    std::cout << "via std::move: ";
    overloaded( std::move( arg ) ); // conceptually this would invalidate arg
    std::cout << "by simple passing: ";
    overloaded( arg );
}

int main() {
    std::cout << "initial caller passes rvalue:\n";
    forwarding( 5 );
    std::cout << "initial caller passes lvalue:\n";
    int x = 5;
    forwarding( x );
}

Howard bahseder gibi, hem de bu iÅŸlevleri sadece baÅŸvuru türü için döküm olarak benzerlikler var. Ama bu özel kullanım durumları dışında rvalue baÅŸvuru atmalarını yararlılığı ™.9 kapsar), static_cast doÄŸrudan kullanmak ve ne yaptığını iyi bir açıklama yazmak gerekir.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKÄ°M 2006
  • jagadambarecords

    jagadambarec

    13 AÄžUSTOS 2008
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZÄ°RAN 2006