Goto before variable initialization causes compiler error
With that goto
, you are skipping the line:
std::vector<std::string> words = Utility::split(line);
This isn't just skipping the re-initilisation, it's skipping the creation. Because that variable is defined inside the loop, it's created freshly each time the loop iterates. If you skip that creation, you can't use it.
If you want it created once, you should move that line outside of the loop.
I'll refrain from my first inclination, which is to tell you that using goto
and cleaner
in the same sentence is usually wrong - there are situations where goto
is better but I'm not sure this is one of them. What I will tell you is that, if this is homework, goto
is a bad idea - any educator will frown upon the use of goto
.
You are skipping over the construction of the words
array:
if(line.size() < 2)
goto SkipAndRestart;
std::vector<std::string> words = Utility::split(line);
// ...
SkipAndRestart:
You could have used words
after the SkipAndRestart:
label, which would have been a problem. You don't use it in your case, but the words
variable won't be destructed until the end of the scope in which it is introduced, so as far as the compiler is concerned, the variable is still in use at the point of the label.
You can avoid this by putting words
inside its own scope:
if(line.size() < 2)
goto SkipAndRestart;
{
std::vector<std::string> words = Utility::split(line);
// ...
}
SkipAndRestart:
Note that the continue
statement jumps to the end of the loop, at a point where you actually can't put a label. This is a point after the destruction of any local variables inside the loop, but before the jump back up to the top of the loop.