2017-12-22 12 views
-1

다음 프로그램은 정상적으로 컴파일되어 실행됩니다.왜 C++에서는 초기 정의에서 선언 된 변수를 참조 할 수 있습니까?

clang++ -o wut -Wall -Wextra -Werror -pedantic -ansi test.cc 

내가이 아마 더 의미

size_t foo; 
foo = sizeof(foo); 

에 해당하는 것을 이해 컴파일 명령을 사용하여

#include <iostream> 

using namespace std; 

int main() { 
    size_t foo = sizeof(foo); 
    cout << foo << endl; 
    return 0; 
} 

.

그러나 초기 사례는 LHS (또는 전반적인 성명)가 실행되기 전에 평가되는 RHS를 생각하기 때문에 약간의 마음을 상하게합니다.이 경우에는 foo이 아직 존재하지 않을 수도 있습니다.

그러나 가정 할 때 size_t foo은 항상 컴파일 타임에 자체 문으로 나뉘어 정의되고 그 다음에 선언문이 만들어집니다.

내 가정이 맞습니까? 이것이 명세에서 다루고 잘 정의되어 있는가? 그렇다면 어떤 섹션입니까? 나는 -ansi으로 컴파일 된 것을 알지만,이 코드는 오류없이 모든 표준 버전에서 작동합니다. 당신은 [basic.scope.pdecl]을 찾고

+0

@JesperJuhl 물론 프로그램은 의미가 없습니다. 다소 명백한 것에 감사드립니다. 나는 그것이 유효하다는 것을 결코 말하지 않았다, 다만 그것은 clang 하에서 경고/에러없이 컴파일되었다. 나는 구체적으로, 이것을 지배하는 표준의 섹션 또는 그것이 잘 정의되었는지 여부에 대해 질문했다. 자유롭게 답변을 추가하십시오. – Qix

+1

@JesperJuhl'std :: cout'없이 잘 정의되어 있습니다. 그리고 그것은'std :: uintptr_t'로 전환함으로써 해결 될 수 있습니다. –

+1

아마 관련된 질문입니다 : 생성자에서'this'를 참조하는 것이 타당 할 것이라고 생각합니까? –

답변

3

: 이름에 대한 선언의

점 (있는 경우)를 제외하고 완전한 선언자 (11 항) 후에는 초기화되기 직전입니다 아래 명시된 바와 같이 그것은 =에 도달하면

그래서, foo의 정의가 완료 (선언도입니다) 그리고 그것은 자신의 이니셜에서 참조 할 수있다.

+0

고마워,이게 내가 찾고 있던거야. – Qix

+1

@Qix 흥미로운 이유는 이것이 왜 그런지 아닌 이유 때문입니다. – juanchopanza

+0

@juanchopanza 표준이기 때문에 ...? 그것이 표준이 지시하는 것입니다. 그게 내가 찾고 있던거야. 나는 Ritchie의 머리를 통해 그가 무엇을 결정할 때 무엇이 ​​달리고 있는지를 묻지 않고 있었다. 그것은 OP의 요점이 아니 었습니다. – Qix