C++ Standard hat: Es ist möglich, in einen Block zu wechseln, aber nicht auf eine Weise, die Deklarationen mit Initialisierung umgeht. Ein Programm, das von einem Punkt, an dem eine lokale Variable mit automatischer Speicherdauer nicht im Gültigkeitsbereich ist, zu einem Punkt springt, an dem sie im Gültigkeitsbereich ist, ist nicht formgerecht, es sei denn, die Variable hat den Typ POD (3.9) und ist ohne Initialisierung deklariert (8.5).
Der Code zur Veranschaulichung dieser Regel:
#include <iostream>
using namespace std;
class X {
public:
X()
{
cout << "constructor" << endl;
}
~X()
{
cout << "destructor" << endl;
}
};
template <class type>
void ill_formed()
{
goto lx;
ly:
type a;
lx:
goto ly;
}
template <class type>
void ok()
{
ly:
type a;
lx:
goto ly;
}
void test_class()
{
ok<X>();
// compile error
ill_formed<X>();
}
void test_scalar()
{
ok<int>();
ill_formed<int>();
}
int main(int argc, const char *argv[])
{
return 0;
}
Der Code, der die Wirkung des Initialisierers zeigt:
#include <iostream>
using namespace std;
int test1()
{
int i = 0;
// There jumps fo "case 1" and "case 2"
switch(i) {
case 1:
// Compile error because of the initializer
int r = 1;
break;
case 2:
break;
};
}
void test2()
{
int i = 2;
switch(i) {
case 1:
int r;
r= 1;
break;
case 2:
cout << "r: " << r << endl;
break;
};
}
int main(int argc, const char *argv[])
{
test1();
test2();
return 0;
}