2016-08-26 2 views
3

I CppCon 2015 Vortrag Writing Good C++14... By Default von Herb Sutter gucke, ist er auf einige Lebensdauer Einschränkungen beziehen, zB:Ist die "Lifetime" -Restriktion in C++ implementiert?

template<class Key, class T, /*...*/> class map { 
iterator insert(const_iterator pos[[lifetime(this)]], const value_type&); 
template <class InIter> void insert(InIter first, InIter last [[lifetime(first)]]); 
// ... 
}; 

so dass

map<int,string> m = {{1,"one"}, {2,"two"}}, m2; 
m.insert(m2.begin(), {3,"three"});// ERROR, m2.begin() points to m2, not m 
m.insert(m.begin(), {3,"three"});// ok, m.begin() points to m 
m.insert(m.begin(), m.end()));// 2 ERRORS: (a) params point to m, and (b) m is modifiable by m.insert 
m.insert(m2.begin(), m.end()));// ERROR, param1 points to m2, but param2 points to m 
m.insert(m2.begin(), m2.end());// ok, params point to m2, m2 not modifiable by m.insert 

Ich frage mich, ist diese "Lebenszeit" ein Feature bereits implementiert, oder es ist immer noch auf der Wunschliste?

+3

Oh Gott, C++ Entwurfskomitee, mach es halt, * mach es halt *. All diese Attribute ... sie sind wie die Hashtags des Codes; oder der C++ - Entwurf entspricht "Ah, scheiß drauf, lass es uns einfach einen Tag nennen und geh in den Pub". –

+0

Also, es ist nur in der Vorschlagsphase für jetzt, oder? @JasonC – athos

+3

Es scheint nicht in [die Liste der Standardattribute in cppreference.com] (http://en.cppreference.com/w/cpp/language/attributes) erscheinen, aber IDK, wie endgültig das ist. –

Antwort

0

Sutters Rede ist von den C++ Basisrichtlinien, nicht die Internationale Norm von C++. Der internationale Standard, der im Rahmen des ISO-Prozesses erstellt und aufrechterhalten wird, ist ein internationaler Vertrag, der als die Definition von C++ dient. Die C++ Core Guidelines sind nicht wirklich Teil von C++, sondern eher eine Gemeinschaftsarbeit, um zu beschreiben, wie C++ gut zu verwenden ist.

Die C++ - Kernrichtlinien definieren eine Reihe von Richtlinien zu Codequalität und Sicherheit (einschließlich lebenslanger Sicherheit). Es definiert auch eine unterstützende Bibliothek, eine minimale Menge an In-Code-Annotation (unter Verwendung von Attribut, Typ-Alias ​​etc.) und statische Analyse, um die Richtlinien durchzusetzen.

In der ursprünglichen Frage wird nicht erwähnt, dass es sich bei dieser Frage um den Internationalen Standard, die C++ - Kernrichtlinien, Mainstream-Compiler oder relevante statische Analysetools handelt. Es ist auch unklar, ob die Prämissen dieser Frage das Bewusstsein für die Unterscheidung zwischen diesen vier Dingen beinhalten.

Zum Zeitpunkt der Erstellung dieses Artikels entwickeln sich die C++ - Kernrichtlinien weiter. Der Abschnitt der lebenslangen Sicherheitsprofilierung ist noch leer. Ebenso entwickeln sich auch die statischen Analysewerkzeuge. Microsoft's C++ Core Guidelines Checkers already has a preview of lifetime safety checker.Clang-Tidy does not have lifetime safety check for now. Aber zukünftige Entwicklung wird erwartet und dieser Absatz wird daher veraltet sein.

Es ist möglich, dass einzelne Compiler-Verkäufer beschließen, Elemente der Richtlinien in den Kompilierungsprozess einzubeziehen. Aber es liegt wirklich an den Compiler-Anbietern, und einige Richtlinien sind möglicherweise nicht dazu geeignet, während des Kompilierungsprozesses durchgesetzt zu werden. In ähnlicher Weise können einige Elemente der Leitlinien in Zukunft für die Normung vorgeschlagen werden, aber viele von ihnen sind nicht geeignet, Teil des Internationalen Standards und besser links als Gemeinschaftsrichtlinien zu sein.

+0

Ich dachte, es ist klar, dass diese "Lebensdauer" eine Sprachfunktion sein muss, die Compiler zu verdauen benötigt. – athos

Verwandte Themen