문제

인사, 모두!

내 자신의 코드를 검토하면서 나는이 흥미로운 줄에 올랐다.

const CString &refStr = ( CheckCondition() ) ? _T("foo") : _T("bar");

이제 나는 완전히 상실하고 왜 그것이 합법적인지 이해할 수 없습니다. 내가 이해하는 한, const 참조는 r- 값 또는 l- 값으로 초기화되어야합니다. 비 초기의 참조는 존재할 수 없습니다. 하지만 ()? 연산자는 참조에 값을 할당하기 전에 CheckCondition () 함수를 실행합니다. CheckCondition ()이 실행되는 동안 refstr는 존재하지만 여전히 초기화되지 않았다는 것을 알 수 있습니다. CheckCondition ()이 예외를 던지거나 GOTO 문으로 제어를 통과하면 어떻게됩니까? 참조가 발의되지 않은 상태로 남겨 두나요, 아니면 내가 뭔가를 놓치고 있습니까?

도움이 되었습니까?

해결책

더 간단한 예 : const int x = foo();

이 상수도 초기화되어야하며 foo() 호출해야합니다. 필요한 순서로 발생합니다. x는 Foo가 돌아올 때만 존재합니다.

추가 질문에 답변하려면 : if foo() ~일 것이다 throw, 예외는 a catch() 어딘가에. 그만큼 try{} 그것을위한 블록 catch() 둘러싸여 있습니다 const int x = foo(); 확실히. 따라서 const int x 이미 범위를 벗어 났으며, 결코 가치를 얻지 못한다는 것은 관련이 없습니다. 그리고 없다면 catch 예외적으로 귀하의 프로그램 (포함 const int x) 사라.

C ++에는 무작위가 없습니다 goto'에스. 그들은 내면으로 뛰어들 수 있습니다 foo() 그러나 그것은 중요하지 않습니다. foo() 여전히 돌아와야합니다.

다른 팁

당신은 무언가를 놓치고 있습니다 - 그것은 완전히 합법적 인 코드이며, 실제로 그러한 코드는 조건부 운영자의 가장 일반적이고 가장 잘 사용되는 것 중 하나입니다. 컴파일러가 내부적으로 코드가 페이지에 배치 된 것과 같은 순서로 내부적으로 일을해야한다고 생각하는 것은 항상 실수입니다. 조건부 연산자를 평가 한 다음 결과를 사용하는 것이 완벽합니다. 초기화를 수행하십시오.

GOTO는 초기화에서 하나를 사용할 방법이 없습니다. 그리고 예외가 발생하면, 참조는 처음에는 결코 만들어지지 않은 것으로 간주됩니다.

비 초기의 참조는 존재할 수 없습니다.

불행히도 초기화 중에 재미있는 일을 할 수 있습니다. 당신은 또한 글을 쓸 수도 있습니다

const int& a = foobar(a) ? 1 : 2;

또는 문제를 위해

const int& a = a;

컴파일러가 왼쪽에서 오른쪽으로 진행됨에 따라 A는 실제로 오른쪽의 범위에 있다고 생각합니다. 기술적으로 당신은 그것을 사용할 수 있어야하며 기껏해야 경고 할 수 있습니다.

"comeautest.c", 9 행 : 경고 : 변수 "a"는 값이 설정되기 전에 사용됩니다.

  const int& a = foobar(a) ? 1 : 2;
                        ^

당연히 이것은 초기화되지 않은 변수를 사용하는 것처럼 정의되지 않은 동작만을 초래할 수 있습니다.

참조가 초기화되기 전에 참조를 사용하지 않기 때문에 예제는 괜찮습니다.

CheckCondition ()이 실행되는 동안 refstr는 존재하지만 여전히 초기화되지 않았다는 것을 알 수 있습니다.

언어 변호사의 관점에서 볼 때 이것은 잘못입니다. 초기화 중에 refStr 아직 존재하지 않습니다. 나는 당신의 비주얼 디버거가 당신에게 오해의 소지가있는 힌트를주고 있다고 생각합니다.

초기화 내부의 코드가 오류 조건으로 이어지면 refStr 존재하지 않을 것이며, 존재하지 않았을 것입니다.

이것은 완전히 합법적입니다. 이 작업은 성공적으로 끝나고 참조가 유효한 객체에 바인딩되거나 예외가 발생하고 제어가 블록 외부에서 전달되고 기준은 더 이상 범위가 아니므로 더 이상 아무도 신경 쓰지 않습니다.

예외는 refstr에 접근 할 수없는 곳으로 가져갈 수 있으며 거기에서 어디에서 어디에서 갈 수없는 곳으로 갈 수 없습니다. goto는 함수 인 경우 CheckCondition ()에서 벗어날 수 없으며 매크로 인 경우 GOTO를 사용할 수 없습니다. longjmp ()는 예외와 동일한 영향을 미칩니다. refstr가 접근 할 수없는 곳으로 갈 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top