Söz Dizimi
C++11 ile gelen bu özelliğin söz dizimi şöyle
Biz kodlarken şöyle yaparız
container nesnesinin yok olması
Aşağıdaki kod döngü daha başlamadan S geçici nesnesi bellekten silindiği için hatalıdır.
Kesinlikle yapılmamalıdır. Aşağıdaki kod hatalıdır.
C++11 ile gelen bu özelliğin söz dizimi şöyle
for ( for-range-declaration : expression ) statement
Üretilen kodun söz dizimi C++17'den önce şöyle.{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
C++17 ile şöyle.{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
Değişikliğin açıklaması şöyle.Üretilen KodAs of C++17, the types of the begin_expr and the end_expr do not have to be the same ...
Biz kodlarken şöyle yaparız
for(auto x:exp){ /* code */ }
Şöyle bir kod üretilir.{
auto&& __range=exp;
auto __it=std::begin(__range);
auto __end=std::end(__range);
for(; __it!=__end;++__it){
auto x=*__it;
/* code */
}
}
Yani iterator ile container üzerinde dolaşılıyor.container nesnesinin yok olması
Aşağıdaki kod döngü daha başlamadan S geçici nesnesi bellekten silindiği için hatalıdır.
struct S
{
map<string, string> m;
S()
{
m["key"] = "b";
}
const string &func() const
{
return m.find("key")->second;
}
};
for (char c : S().func())
cout << c;
range içinde container'dan silme işlemiKesinlikle yapılmamalıdır. Aşağıdaki kod hatalıdır.
std::map<int, int> someMap;
/* Fill in someMap */
for (auto& element : someMap)
{
/* ... */
if ( /* Some condition */ )
someMap.erase(element.first);
}
Bu kod da hatalıdır.for (string & s : set)
{
map.erase(s);
}
Hiç yorum yok:
Yorum Gönder