Почему нельзя инициализировать в case?
switch(1){
case 1:
    double d = 1; //ошибка
}
Почему нельзя инициализировать в case?
С этим кодом всё в порядке с точки зрения стандарта. Проблемы начнутся, если добавить меток case в switch после определения переменной d. Переход на эти метки входит в область видимости переменной d, но минует её инициализацию. Это запрещено стандартом (с++98, 6.7:3):It is possible to transfer into a block, but not in a way that bypasses declarations
with initialization. A program that jumps from a point where a local variable with
automatic storage duration is not in scope to a point where it is in scope is ill-formed
unless the variable has POD type (3.9) and is declared without an initializer.
Это из кривого наследия C скорее всего. 
switch/case сродни goto но не совсем оно
поэтому можно делать всякие дикие вещи с циклами и if перекрывающими части switch.
И в итоге, что получается.
Такой код вполне себе валидный:int x = 1;
switch (x) {
	case 1:;
	case 2:
		int b = 2;
}

/// Даже с добавлением таких извращений

switch (x) {
	case 1:
		if (a == 1) {
	case 2:
		int b = 2;
	}
}
А такой уже нетint x = 1;
switch (x) {
	case 2:
		int b = 2;
	case 1:;
}
И вроде как всё объяснимо. с одной стороны b видима везде после её объявления, но в case 1 мы можем придти минуя это объявление, как бы противоречие.
В C таких проблем нет, т.к. переменные должны объявляться в начале блока.
Решить можно 2.5 способами. 
1. Обернуть действия в case фигурными скобками
1.5 Вынести их в отдельную функцию
2. Описать переменную до switch