SORU
5 HAZİRAN 2013, ÇARŞAMBA


C Lambda: arasındaki Fark "kesilebilir"-yakalama-referans

C bu gibi örneğin Lambda bildirebilirsiniz:

int x = 5;
auto a = [=]() mutable {   x; std::cout << x << '\n'; };
auto b = [&]()         {   x; std::cout << x << '\n'; };

Her iki x, fark nedir? yani değiştirmek için bana izin ver

CEVAP
5 HAZİRAN 2013, ÇARŞAMBA


Neler oluyor

İlk sadece x kendi kopyasını değiştirin ve dışında x değişmeden kalır. İkinci olarak değiştirirx dışında.

Her denedikten sonra: bir yazdırma deyimi ekleyin

a();
std::cout << x << "----\n";
b();
std::cout << x << '\n';

Bu baskı bekleniyor:

6
5
----
6
6

Neden

Lambda 12* *dikkate almak faydalı olabilir ([ifade.prim.lambda] Standart).

Var[...] kamu satır içi işlev çağrısı operatörü [...]const üye işlev olarak bildirilmiş olan, ama sadece[...] ve lambdaexpression parameter-declaration-clause mutable takip eder(italik metin = standart teklif).

Eğer olarak düşünebilirsiniz

    int x = 5;
    auto a = [=]() mutable {   x; std::cout << x << '\n'; };

==>

    int x = 5;

    class __lambda_a {
        int x;
    public:
        __lambda_a () : x($lookup-one-outer$::x) {}
        inline void operator() {   x; std::cout << x << '\n'; }     
    } a;

ve

    auto b = [&]()         {   x; std::cout << x << '\n'; };

==>

    int x = 5;

    class __lambda_b {
        int &x;
    public:
        __lambda_b() : x($lookup-one-outer$::x) {}
        inline void operator() const {   x; std::cout << x << '\n'; }         
        //                     ^^^^^
    } b;

Q:Ama eğer const bir fonksiyonu varsa, neden hala x değiştirebilirim?

Bir:Sadece değişiyor20* *dışında. Lambda x kendi başvuru işlemi x değiştirmezbaşvuruamareferans verilen değer.

Bu C , işaretçi/başvuru constness pointee/referencee içinden görülen constness değiştirmek için çalışıyor.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Easy Learn Tutorial

    Easy Learn T

    10 Kasım 2012
  • ImBluecams

    ImBluecams

    25 Kasım 2012
  • trickycharms

    trickycharms

    6 Aralık 2013