2016-04-06 12 views
2

Benzersiz işaretçi xvalue argümanlarını anladığımdan emin olmak istiyorumBenzersiz işaretçiler xvalue Anlambilim? Neden lambda f2'nin davranışı lambda f1'den farklıdır?

Bu, std :: move ve benzersiz işaretçileri öğrenmek için yazdığım örnek bir koddur. Line2'nin neden çarptığını ancak satır1'in çalıştığını kimse anlatabilir mi? Benim test programımda lambda f2'de hareket ne yapar, neden std :: move sonra line1 çalışır? Bu sadece benim öğrenme için ve std :: hareket r-değeri referans için sadece bir döküm olduğu için değil ödev sorun, ben 1 eserleri C++ 14 ve C++ 11

#include <iostream> 
#include <functional> 
#include <memory> 

void test() 
{ 

    std::unique_ptr<int> p (new int(278)); 
    auto f1 = [](std::unique_ptr<int> i){std::cout << *i << std::endl;}; 
    auto f2 = [](std::unique_ptr<int> &&i){std::cout << *i << std::endl;}; 

    f2(std::move(p)); 
    std::cout << *p << std::endl; //line 1 

    f1(std::move(p)); 
    std::cout << *p << std::endl; //line 2 
} 

int main(int argc, const char * argv[]) { 
    test(); 
    return 0; 
} 
+0

düzenlemeleri de ekledi, derlemedim çünkü üstbilgiyi ekledim –

+0

Tüm kodu Xcode Sürüm 7.2'den yapıştırıyorum. Evet üzgünüm yazım hatası. Çok üzgünüm –

+0

Apple LLVM 7.0, yazım hatalarını düzelttim. Yakalamak için teşekkür ederim –

cevap

0

Hat çok yeniyim . Gerçekleşen devir işlemi genellikle, her ikisi de f2’de bulunmayan hareket ettirici veya hareket ataması operatörü tarafından yapılır. Satır 2, f1 çağrılarındaki değere göre argümanı geçirme yapıcıyı taşıdığından, ardından unique_ptr boş olduğu için çöküyor.