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

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • Lamborghini

    Lamborghini

    13 Aralık 2005
  • WK

    WK

    9 Ocak 2006