c++ - initialization of 'unused' is skipped by 'goto label' - why do I get it for std::string but not for int? -


i bumped against error in code, , after experimenting stumbled upon weirdness - std::string, not int.

for std::string error c2362: initialization of 'unused' skipped 'goto label':

{   goto label;     std::string unused; label:; } 

for int i don't error, however:

{   goto label;     int unused = 10; label:; } 

why difference? because std::string has non-trivial destructor?

this covered in draft c++ standard section 6.7 declaration statement says (emphasis mine):

it possible transfer block, not in way bypasses declarations initialization. a program jumps87 point variable automatic storage duration not in scope point in scope ill-formed unless variable has scalar type, class type trivial default constructor , trivial destructor, cv-qualified version of 1 of these types, or array of 1 of preceding types , declared without initializer (8.5).

and provides following example:

void f() {   // ...   goto lx; // ill-formed: jump scope of ly:   x = 1;   // ... lx:  goto ly; // ok, jump implies destructor           // call followed construction           // again following label ly } 

although both cases should generate error since bypassing initialization in both cases, have been fine:

goto label;       int unused ; label: 

so visual studio not correct here, both gcc , clang generate , error code, gcc says:

error:   crosses initialization of 'int unused'        int unused = 10;            ^ 

of course visual studio can have extension long document not portable use such extension, pointed out both clang , gcc generate error this.

we can find rationale why don't want jump across initialization in defect report 467 sought have same restriction added local static variable (it rejected):

[...]automatic variables, if not explicitly initialized, can have indeterminate (“garbage”) values, including trap representations, [...]


Comments

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -