std::atomic



  • Huhu,

    Welchen Grund hat es, dass Operatoren für atomics nicht überladen wurden, sondern dafür freie Funktionen verwendet werden müssen?

    Grüße,
    PI



  • Welche Operatoren? Unter http://www.stdthread.co.uk/doc/headers/atomic/atomic.html finde ich keine.


  • Mod

    314159265358979 schrieb:

    Huhu,

    Welchen Grund hat es, dass Operatoren für atomics nicht überladen wurden, sondern dafür freie Funktionen verwendet werden müssen?

    Grüße,
    PI

    Verstehe die Frage nicht.



  • std::atomic<int> i(0);
    std::atomic_fetch_add(&i, 42); // warum nicht i += 42;
    

  • Mod

    314159265358979 schrieb:

    std::atomic<int> i(0);
    std::atomic_fetch_add(&i, 42); // warum nicht i += 42;
    

    gibt es doch.

    n3290 schrieb:

    template <> struct atomic<integral> {
    ...
    operator integral() const volatile noexcept;
    operator integral() const noexcept;
    ...
    atomic() noexcept = default;
    constexpr atomic(integral) noexcept;
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;
    integral operator=(integral) volatile noexcept;
    integral operator=(integral) noexcept;
    integral operator++(int) volatile noexcept;
    integral operator++(int) noexcept;
    integral operator--(int) volatile noexcept;
    integral operator--(int) noexcept;
    integral operator++() volatile noexcept;
    integral operator++() noexcept;
    integral operator--() volatile noexcept;
    integral operator--() noexcept;
    integral operator+=(integral) volatile noexcept;
    integral operator+=(integral) noexcept;
    integral operator-=(integral) volatile noexcept;
    integral operator-=(integral) noexcept;
    integral operator&=(integral) volatile noexcept;
    integral operator&=(integral) noexcept;
    integral operator|=(integral) volatile noexcept;
    integral operator|=(integral) noexcept;
    integral operator^=(integral) volatile noexcept;
    integral operator^=(integral) noexcept;
    };
    




  • Das kommt davon, wenn man Header liest, und sich wundert, warum man die Operatoren nicht findet. Funktioniert, danke.

    Gibts einen Grund, warum

    std::atomic<T> a = t;
    

    nicht funktioniert?


  • Mod

    314159265358979 schrieb:

    Das kommt davon, wenn man Header liest, und sich wundert, warum man die Operatoren nicht findet. Funktioniert, danke.

    Gibts einen Grund, warum

    std::atomic<T> a = t;
    

    nicht funktioniert?

    Ich würde es bevorzugen, wenn du deine Fragen anders stellst. Ein Warum macht erst Sinn, nachdem 1. eine Beobachtung gemacht wurde, 2. diese Beobachtung mit einer bestimmten Erwartung verglichen wird; ist also der 3. Schritt, falls zwischen 1. und 2. eine Diskrepanz auftritt. Stellst du gleich die Warum-Frage, kann zu 1. und 2. nichts mehr gesagt werden; übrigens ein Grund der jedenfalls bei mir sehr schnell dazu führt, dass ich die Frage ganz ignoriere (sofern das Problem dort zu verorten ist).

    Hier liegt vermutlich ein Problem mit 1. vor. Je nachdem, entweder hast du das Ganze mit einem Compiler versucht - dann ist möglicherweise dort die Unterstützung nicht ausreichend. Oder du hast den Standard gelesen, in diesem Fall wohl nicht intensiv genug. Jedenfalls ist die betreffende Überladung (zufällig) bereits in meinem vorherigen Beitrag dabei.



  • std::atomic<int> i = 42;
    

    ../main.cpp:57:23: error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'



  • Steht doch eh alles schon in der Fehlermeldung?



  • 314159265358979 schrieb:

    std::atomic<int> i = 42;
    

    ../main.cpp:57:23: error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'

    Ja, das ist korrekt.

    PS:
    Bemueh dich doch ein bisschen. Nur ein bisschen. Ein klitzi kleines bisschen. Nur ganz ganz ganz ganz ganz wenig.



  • dot schrieb:

    Steht doch eh alles schon in der Fehlermeldung?

    Seit wann wird hier denn ein Copy Ctor aufgerufen?!



  • 314159265358979 schrieb:

    dot schrieb:

    Steht doch eh alles schon in der Fehlermeldung?

    Seit wann wird hier denn ein Copy Ctor aufgerufen?!

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=copyvsdirect#Answ

    Grundlagen 😕



  • Du hast die Fehlermeldung offenbar nicht gelesen. Tu's bitte nochmal, bevor du versuchst, mich als Depp hinzustellen.



  • 314159265358979 schrieb:

    dot schrieb:

    Steht doch eh alles schon in der Fehlermeldung?

    Seit wann wird hier denn ein Copy Ctor aufgerufen?!

    Spätestens seit es einen C++ Standard gibt...



  • Ach wisst ihr was, lassts gut sein. Ihr wollt mir eh nicht helfen, und auf dümmliche Aussagen kann ich verzichten. Danke auch.



  • 314159265358979 schrieb:

    Du hast die Fehlermeldung offenbar nicht gelesen. Tu's bitte nochmal, bevor du versuchst, mich als Depp hinzustellen.

    Lies dir den Link durch, da steht die Problematik ganz genau beschrieben. Als Depp hast du dich gerade selbst abgestempelt.



  • Der Compiler beklagt sich dass es keinen Copy-Constructor gibt. Für die Copy-Initialization ist der aber notwendig. Viel mehr gibts dazu einfach nicht zu sagen 😕



  • 314159265358979 schrieb:

    Du hast die Fehlermeldung offenbar nicht gelesen. Tu's bitte nochmal, bevor du versuchst, mich als Depp hinzustellen.

    Das hast du schon längst selber getan. 😉
    Quelle



  • seldon schrieb:

    Lies dir den Link durch, da steht die Problematik ganz genau beschrieben. Als Depp hast du dich gerade selbst abgestempelt.

    Wenn ich einen Link bekomme, bei dem der Titel "Q: Wird für T x = u; der Zuweisungsoperator von T aufgerufen?" lautet, komme ich mir veräppelt vor.

    Und im Übrigen steht da auch: "Der C++ Standard erlaubt bei copy-initialization die Eleminierung des temporären Objekts. [...] In diesem Fall wird aus der copy-initialization also eine direct-initialization."

    Ich will keinen Copy Ctor aufrufen, ich will den stinknormalen T-Ctor aufrufen. Ist das so schwer zu kapieren?

    Eure Art ist wieder mal zum Kotzen. Vielen Dank. Vielen Dank für nichts.


Anmelden zum Antworten