Lambda ifodalari misollar bilan. Yuqori darajadagi funktsiyalar va lambdalar


Download 37.33 Kb.
bet5/17
Sana25.10.2023
Hajmi37.33 Kb.
#1720034
1   2   3   4   5   6   7   8   9   ...   17
Bog'liq
Lambda ifodalari misollar bilan

Taklifni tuzatish
Yangi o'zgaruvchilar lambda ifodasi tanasiga kiritilishi mumkin (in C++ 14). Bundan tashqari, lambda iboralari foydalanishi mumkin, yoki tuzatish, atrofdagi o'zgaruvchilar. Lambda ifodasi commit bandi bilan boshlanadi (standart sintaksisida, lambda-introduktor), bu aniqlanishi kerak bo'lgan o'zgaruvchilarni, shuningdek aniqlash usulini belgilaydi: qiymat bo'yicha yoki mos yozuvlar bo'yicha. Ampersand (&) bilan prefikslangan o'zgaruvchilarga havola orqali, prefikssiz o'zgaruvchilarga esa qiymat orqali kirish mumkin.
Bo'sh majburiy band () lambda ifodasining tanasi tashqi doiradagi o'zgaruvchilarga kira olmasligini bildiradi.
Lambda ifodasi orqali havola qilingan tashqi oʻzgaruvchilar qanday suratga olinishini belgilash uchun siz standart suratga olish rejimidan foydalanishingiz mumkin (standart sintaksisdagi suratga olish-standart): [&] - barcha oʻzgaruvchilar mos yozuvlar boʻyicha, [=] – qiymat boʻyicha olinadi. Siz avval standart majburiy rejimdan foydalanishingiz mumkin, keyin esa ma'lum o'zgaruvchilar uchun boshqa rejimni qo'llashingiz mumkin. Misol uchun, agar lambda ifodasining tanasi tashqi o'zgaruvchiga mos yozuvlar bo'yicha va tashqi o'zgaruvchi omiliga qiymat bo'yicha kirsa, quyidagi majburiy shartlar ekvivalent bo'ladi:
[&jami, omil] [&, omil] [=, &jami] [&jami, =]
Capture-default dan foydalanilganda, faqat lambda ifodasida qayd etilgan o'zgaruvchilar yozib olinadi.
Agar commit bandi capture-default & ni o'z ichiga olsa, ushbu majburiy bandning capture parametrida hech qanday identifikator shakl & identifikatoriga tegishli bo'lishi mumkin emas. Xuddi shunday, agar commit bandi capture-default = ni o'z ichiga olsa, ushbu commit bandining capture parametrlaridan hech biri = identifikator shaklida bo'lishi mumkin emas. Identifikator yoki bu tutib olish bandida bir necha marta ishlatilmaydi. Quyidagi kod parchasi ba'zi misollarni beradi.
struct S ( void f(int i); ); void S::f(int i) ( [&, i](); // OK [&, &i](); // XATO: i oldidan & qachon & asl qiymati[=, bu ](); // XATO: bu asl qiymati = bo'lsa(); // XATO: takrorladim)
Quyidagi misolda ko'rsatilganidek, ellipsdan keyin capture paket kengaytmasi hisoblanadi:
shablon void f(Args... args) ( auto x = (qaytish g(args...); ); x(); )
Sinf usulining tanasida lambda iboralarini ishlatish uchun siz qo'shuvchi sinfning usullari va ma'lumotlar a'zolariga kirishni ta'minlash uchun ushbu ko'rsatgichni majburiy bandga o'tkazishingiz kerak. Sinf usullari bilan lambda ifodalarini ishlatish misoli uchun qarang ("Usulda lambda ifodasini qo'llash" bo'limiga qarang).
Yo'naltiruvchi fiksatsiya o'zgaruvchilarni tashqaridan o'zgartirish uchun ishlatilishi mumkin, qiymatni aniqlash esa mumkin emas. (o'zgaruvchan nusxalarni o'zgartirishga imkon beradi, lekin asl nusxalarni emas.)
Ma'lumotnomalarni tuzatish tashqi tomondan o'zgaruvchilarga kiritilgan o'zgarishlarni aks ettiradi, qiymatlarni tuzatish esa aks ettirmaydi.
Malumot fiksatsiyasi umr bo'yi bog'liqlikni keltirib chiqaradi, qiymatni aniqlash esa umr bo'yi bog'liqlikka ega emas. Bu, ayniqsa, lambda iboralarini asenkron ishlatganda juda muhimdir. Agar mahalliy o'zgaruvchi mos yozuvlar orqali asinxron lambda ifodasida ushlangan bo'lsa, ehtimol u chaqirilgan vaqtga kelib kirish imkonsiz bo'lib qoladi, bu esa ishlash vaqtidagi ruxsatni buzish istisnosiga sabab bo'ladi.

Download 37.33 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   17




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling