Strukturbindungen, die nicht in C ++ 17 kompilieren werden, aber es tut es trotzdemC++

Programme in C++. Entwicklerforum
Anonymous
 Strukturbindungen, die nicht in C ++ 17 kompilieren werden, aber es tut es trotzdem

Post by Anonymous »

Ich lese hier und da hier und da über Strukturbindungen in C ++ 20. Diese Funktion wurde jedoch in C ++ 17 eingeführt und hatte nur wenige Probleme: < /p>

[*] Kann Speicherspezifizierer nicht verwenden (

Code: Select all

static
oder thread_local )
Wenn in einer Klasse verwendet wird, wenn die Datenelemente privat sind, sollten Strukturbindungen, die in Methoden oder Freunden verwendet werden, nicht funktionieren.

Code: Select all

#include 

struct Point {
int x, y;
};

class AClass {
private:
std::string mString;
int mId;

public:
void aMethod(const AClass& p) {
auto s = p.mString;
auto [str, id] = p;  // this should not work, because we're
// accessing private memebers
}
friend void aFriendFunction(const AClass& p) {
auto s = p.mString;
auto [str, id] = p; // Likewise as aMethod
}
};

int main() {
Point p{3, 5};

// This shouldn't work in C++17
static auto [u, v] = p;  // This gives a warning, compilation depends

return 0;
}
, was nach dem, was ich gesammelt habe, nicht funktionieren sollte . Und ich nahm an, dass es nicht kompiliert werden sollte. Diese Zeile jedoch: < /p>
g++ main.cpp -o out -std=c++17
< /code>
gibt mir eine Ausgabe, die gültig und ohne Probleme erscheint. Warum funktioniert das? Vermisse ich etwas? < /P>
Ich bemerke auch das in GCC 7.1. Dies gibt tatsächlich den erwarteten Fehler (mit einem Online -Compiler). Aber wenn ich zu meiner Version von GCC (13.3.0) wechsle, bekomme ich die oben genannte Warnung. Dies wirft für mich die Frage auf, wie sich die strukturierte Bindung in derselben C ++ - Version verändert hat.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post