C++ tudás felfrissítése
2021-04-03T13:38:24+02:00
2021-04-04T18:59:26+02:00
2022-07-20T10:52:04+02:00
  • Ha úgy jobban érthető: ugyanazt csinálták, mint később a Java, vagyis vették azt a mintát, amit a nyelv felhasználói már amúgy is használtak (C++-nál ez a functor volt, Javában az egy metódusos interfészek) és raktak köré syntax sugart. Ennek megvan az az előnye, hogy a meglévő kódok (beleértve a standard könyvtárat is) együtt tudnak működni az új megoldással.
    Mutasd a teljes hozzászólást!
  • A két kód ugyanazt csinálja, arra példa hogy kb mit generál a fordító a lambda syntax-ból.
    Gyakorlatilag egy anonymous functor class-t. Természetesen lesz neve, kb ilyen h struc1403....

    Nézd meg godbolt-on.
    Mutasd a teljes hozzászólást!
  • Köszönöm !
    Itt a lambdás kód mit csinál ? Egy névnélküli osztályt példányosít, és kezdőértéket ad az i és ci változóknak, sorrendben 3-at és 5-öt ? Az n=ci rész mit csinál, n is felveszi az 5 értéket ?

    Illetve a hosszabb kód mit csinál ? Pl. a T c rész ? A c a Lambda osztály példányosítása lesz ? Mi a gyakorlati értelme ezeknek a kódoknak ? Köthető hozzá egy feladat ?
    Mutasd a teljes hozzászólást!
  • Ahogy értem, lényegében annyi az "újdonság" a dologban, hogy talán egyszerűbb, rövidebb a függvény.

    Valóban annyi :)

    int i = 3; const int ci = 5; auto l = [i, ci, n = ci](int a, const int b, auto c) {};
    Lambda nélkül:

    struct Lambda { public: Lambda(int& i, const int& ci, const int& n) : i{i}, ci{ci}, n{n} {} template<typename T> void operator()(int a, const int b, T c) const {} private: int i; const int ci; int n; }; auto l = Lambda{i, ci, ci};
    Mutasd a teljes hozzászólást!
  • Hát a lambda egy jó nagy témakör...lehet elég csak néhány kulcsszót említsek:
    Pl, callback fv, el lehet tárolni pl egy std::function -ben, de lehet pl thread fv is de kényelmes lehet std algoritmusok esetén is, most már lehet pl auto -ként generikus lambdát létrehozni. Sőt mégújabban lehet template lambdát is megadni pl perfect forwarding-al.
    Amire viszont nagyon kell figyelni, hogy a capture milyen élettartamú objektumokat  visz be a lambda scope-ba attól függően mikor milyen szálon lesz hívva.

    Jó tanulást!
    Mutasd a teljes hozzászólást!
  • Köszi, utána olvasok jobban a témának.

    Van egy másik téma, a lambda. Ahogy értem, lényegében annyi az "újdonság" a dologban, hogy talán egyszerűbb, rövidebb a függvény. De azt nem értem viszont, hogy úgy beszélnek róla, mint egy kései, "lazy" hivásról ha jól emlékszem. Ezt valahogy megpróbálom megérteni. Egyenlőre csak azt látom, hogy van ez a lambda, de nem értem, mivel lenne több, mint egy függvényhívás. 
    Pl. amit itt magyaráz a srác, 3:00 körül :

    lambda

    Több ez, mint egy sima függvény hívás ? Nem látom a nagy "újdonságot" a lambdában, pedig tudom, már jó pár éves.
    Mutasd a teljes hozzászólást!
  • Szükségszerűen szerűen cím szerinti átadás lesz az.

    Rvalue-referenciával rvalue-ra lehet hivatkozni, amiket két kategóriára lehet szétbontani: xvalue-ra és prvalue-ra. A prvalue, tiszta értéket jelent, például 42, 'c', stb., az xvalue pedig "expiring value" azaz olyan érték aminek már limitált az élettartama, vagyis a jelenlegi, függvényblokk, kifejezés, stb. után meg fog szűnni.
    A két kategória között különbség, hogy az xvalue típusa, a prvalue típusától eltérően lehet polimorfikus és lehet incomplete. Vagyis tudsz ilyen kódot írni:

    class A { }; class B : public A { }; A&& a = B { }; // rvalue-reference to an expiring-value
    Ha a rvalue-reference _érték_ szerinti átadással működne, akkor a fenti példában a B objektumból valószínűleg _slicinggal_ létrejönne egy másik A típusú objektum (de ekkor az _a_ referenciára nem igazán lehetne mondani, hogy egy B objektumra vagy értékre hivatkozik).

    Amúgy a "&& operátor" kifejezés engem is megzavart, azt hittem, hogy a logikai és operátorra gondolsz. Eddig ezt a típus-módosítót sehol nem láttam, hogy operátornak neveznék. Itt például "Rvalue reference declarator"-nak nevezik: Declarations - cppreference.com De mindegy :)
    Mutasd a teljes hozzászólást!
  • Szerintem ez alapvetően függ a cégtől ahová jelentkezel. Szerintem ma már mindenhova a minimum a c++11. De leginkább az alapelvek, modern c++ összefoglaló néven.
    A 14 és 17 -es szabványok kissebbek voltak, illetve észszerűsítettek pár dolgot. A nagyobb dobás a c++20.
    Az hogy ismered a threading primitíveket biztos hasznos de jó ha el tudod mondani mit miért.

    A másik meg, hogy a legtöbb komoly helyen inkább algoritmikus feladatokat adnak,  a megoldásodból meg úgy is látszani fog, pl milyen szinten ismered/használod az stl-t. 
     Viszont simán rákérdezhetnek akár a static assertekre és a conceptekre....ami viszont elég új dolog, de template metaprogrammingot még sosem kérdeztek sehol sem.
    Mutasd a teljes hozzászólást!
  • Rengeteg minden van a szabványban.

    Amúgy egy C++ interjún (régen interjúztam C++-al) melyik szabványt szeretik. Mert lehet úgy kódolni, hogy a kódot a régi compiler elfogadja, de az új nem. Azt tudom, hogy 2011-ben és 2014-ben voltak komoly újítások.

    Most megnéztem egy rövid videot, egy 2017-es ujdonságról :

    C++17 - The Best Features - Nicolai Josuttis [ACCU 2018]

    Újra nézem, mert elsőre nem vágtam le mindent. De tényleg kell ez ? Egy C++ programozó-tól kérdeznek ilyet is az interjún, vagy az a fontos, hogy az ember gyorsan tanuljon ? Gondolom, a deep-copy, de a move constructor amit kérdeztem, se elég egy interjún, ha csak beszélgetés van, akkor se. Kell tudni, hogy kódolom le a szálkezeléses feladatokat, vagy elég a szálkezelést fogalmilag ismerni ?
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Reference declaration - cppreference.com

    Perfect forwarding-nál is szerepe van.
    Mutasd a teljes hozzászólást!
  • Amire te gondolsz dupla && az úgynevezett move ctor jelölése, illetve természetesen a move assignment-é is. Ennek így tudsz utána nézni. Röviden ha egy osztálynak van ilyen ctor/assignment-je akkor lehetőség van pl. függvény paraméter átadásnál, vagy visszatérésnél olcsó másolást végezni. 
    Azaz a példa kedvéért egy fv vector<bonyolult objektum> mal tér vissza akkor a fordító ha teheti az ilyen move átadást választja, mivel a függvényben létrejött példány csak temporary és úgy is le kéne törölni. Ezért a vector move műveletei egyszerüen csak átveszik a rvalue - a forrás példányból a memória területet, annak címét és kinullázzák a forrásban. Ez sokkalta gyorsabb mint lefoglalni a memóriát és át másolni az elemeket egy olyan objektumból ami amúgy is meg fog szűnni automatikusan.

    E nélkül régen nem volt szokás vector típusú érték szerinti vísszatérési értéket definiálni, viszont most már pont hogy ezért így ildomos!

    Az stl tárolókat és típusokra ez mindenképp így van, de a lehetőség ott van mindenkinél hogy saját osztályhoz is deklaráljon.


    Ugyanakkor nem árt körültekintőek lenni, mikor milyen szabály szerint fogja a fordító melyik ctor-t hívni pl.


    Erre keress rá: rvalue reference és move semantics.


    Ez meg egy kiváló videó részben ebben a témában CppCon 2014: Scott Meyers "Type Deduction and Why You Care"
    Mutasd a teljes hozzászólást!
  • De, van máshol is dupla &, az rvalue-nál, amit a move constructornál használ a C++.
    Most a olvasom a neten. Ez nem a logikai operátor. 

    Csak még azt nem látom tisztán, hogy ebben az esetben címszerinti e a paraméter átadás.
    Mutasd a teljes hozzászólást!
  • "És a && nem cím, hanem érték szerinti ?" : gondolok itt a hivatkozott weblap példáira.
    Mutasd a teljes hozzászólást!
  • Talán a logikai AND műveletre gondolsz? Szerintem máshol nincs dupla &.
    Mutasd a teljes hozzászólást!
  • Most olvasom a neten, hogy a && operátór rvalue-t jelent.
    De ha ezt használom, akkor a paraméter átadás címszerinti, vagy csak a szimpla & a cím szerinti paraméter átadás ? És a && nem cím, hanem érték szerinti ?
    Mutasd a teljes hozzászólást!
  • operator overloading - cppreference.com
    Sziasztok

    C++ tudásomat szeretném felfrissíteni.
    Éppen a 

    operator overloading - cppreference.com

    lapot olvasom, és itt nem teljesen világos a && lényege.

    Természetesen tudom, hogy a & a cím operátor, és hogy használom pl.  integer érték átadására függvénynél, stb.

    De miért kell a duplázott & operátor ? Mit jelent ? Szimpla & nem tudja a feladatot megoldani, a weblap példáin ?
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd