Strukturbindungen, die nicht in C ++ 17 kompilieren werden, aber es tut es trotzdem
Posted: 06 Apr 2025, 23:20
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 ( 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.
, 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.
[*] Kann Speicherspezifizierer nicht verwenden (
Code: Select all
static
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;
}
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.