2016-07-13 8 views
0

switch - case 문에 변수 선언 문제는 this SO post에 잘 설명되어 있으며 대부분의 측면에 대한 답변이 포함되어 있습니다. 그러나 나는 견고한 이유를 찾을 수 없다는 문제에 직면했다. 누군가이 코드를 잘못 설명 할 수 있습니까?switch case 문에서 변수 선언

switch (var) 
{ 
case 0: 
    int test; 
    test = 0; // no error 
    int test2 = 0; // ERROR: initialization of 'test2' is skipped by 'case' label 
    std::string str; 
    str = "test"; // ERROR: initialization of 'str' is skipped by 'case' label 
    break; 
case 1:; 
    break; 
} 

6 번째 줄의 오류가 발생하는 이유는 알고 있습니다. 그러나 다음 두 줄은 무엇이 잘못 되었습니까? 네이티브 타입과 클래스 타입의 차이와 관련이 있을지 모르지만, 확실하지 않습니다.

이것은 중복 질문이 아닙니다 Why can't variables be declared in a switch statement?! 나는 원래 것에 대한 링크를 제공했다. 두 가지 질문을 읽고 차이점을 확인하십시오. AFAIK 문제는 원래 질문에서 논의되지 않았습니다.

답변

1

블록으로 전송할 수는 있지만 초기화와 함께 선언을 무시하는 것은 아닙니다. 자동 저장 기간을 가진 변수가 범위 내에 있지 않은 지점에서 범위에있는 지점까지 점프하는 프로그램이 스칼라 유형, 간단한 기본값 인 생성자가있는 클래스 유형 및 변수가없는 경우에는 0 점이되는 프로그램 사소한 소멸자,이 유형 중 하나의 CV 규정 버전 또는 이전 유형 중 하나의 배열이며 이니셜 라이저 (8.5)없이 선언됩니다.

은 ([stmt.dcl]/3)

직관적 설명은 행하는 초기화 효과적으로 무 조작하지 않는 경우에만 선언을 생략 할 수 있다는 것이다. 값이 제공되면 건너 뛸 수 없습니다. 클래스의 생성자에 코드가 있으면 건너 뛸 수 없습니다.

+0

클래스의 생성자에 코드가 없으면 코드에서 오류가 발생하지 않는다고 결론 내릴 수 있습니까? –

+0

@polfosol 정확하게 말하면, 기본 생성자와 소멸자는 "사소한 것"일 필요가 있습니다. http://en.cppreference.com/w/cpp/language/destructor#Trivial_destructor 및 http://en.cppreference.com/w/cpp/language/default_constructor#Trivial_default_constructor를 참조하십시오. – Brian

관련 문제