2016-05-24 2 views
0

Die empfohlene Methode, Variablen in C++ zu initialisieren 11 wird mit verspannt Initialisierung, aber ich dies so gut wie nie für Schleifen implementiert in sehen:Initialisiert für for-Schleifen, die starre Initialisierung in C++ 11 verwenden, die als schlechte Form betrachtet wird?

// regular initialization 
for(auto i = my_vector.size(); i > 0; --i){ 
    … 
} 

// brace-init-list initialization 
for(auto i{my_vector.size()}; i > 0; --i){ 
    … 
} 

Ist die schlechte Form angesehen oder ist es nicht aus historischen Gründen getan?

+0

Beachten Sie, dass bei der ersten Iteration "i" der Index der letzten nach dem letzten Element ist. –

Antwort

3

Für Standard-C++ 11 und 14, soll Ihr zweites Beispiel eigentlich nicht funktionieren, weil die Typ i wird zu std::initializer_list<int> abgeleitet.

Dies wird in C++ 17 geändert, so dass der Typ korrekt zu int abgeleitet wird. Der Grund, warum Sie die Änderung bereits sehen können, ist, dass die std::initializer_list Ableitung in einem direkten Initialisierungskontext als ein Standardfehler angesehen wird, so dass einige Compiler dies bereits behoben haben. Da Sie sich nicht darauf verlassen können, ob diese Änderung in einer bestimmten Compiler-Version implementiert ist, sollten Sie dieses Initialisierungsformular für den portablen Code nicht verwenden.

+0

Danke. Also, wäre es korrekt, wenn ich es nur geändert habe für 'size_t i {my_vector.size()}; i> 0; --i'? – nachocab

+0

@nachocab Ja, es ist ein solches Problem, das' auto' bewirkt. – TartanLlama

1

Brace-Initialisierung war ein wenig fehlerhaft mit auto, siehe N3922.

Eine korrekte tragbare Art und Weise für eine Rückwärtsschleife:

for(auto i = my_vector.size(); i--;) 

Für Vorwärtsschleife:

for(auto j = my_vector.size(), i = 0; i < j; ++i) 
Verwandte Themen