정적 Const Int에 대한 정의되지 않은 참조: 컴파일러 동작 이해
다음에 대한 참조를 허용하는 foo 템플릿 함수를 정의하는 시나리오를 고려해보세요. T 유형의 상수. Bar 클래스 내에서 정적 상수 정수 kConst를 선언합니다. kConst를 인수로 사용하여 foo를 호출할 때 컴파일러는 "'Bar::kConst'에 대한 정의되지 않은 참조" 오류를 표시할 수 있습니다.
이 오류는 컴파일 시간에 초기화되는 동안 정적 const 정수가 여전히 필요하기 때문에 발생합니다. 특정 방식으로 사용되는 경우 프로그램의 정의. C 표준(9.4.2/4)에 따르면 const 정적 데이터 멤버는 정수 상수 표현식인 경우 클래스 정의에서 초기화될 수 있습니다. 그러나 선언만으로는 const 참조 또는 정수 상수 표현식에 사용하기에 충분하지 않습니다.
foo에 대한 const 참조로 kConst를 전달할 때 표준(3.2/2)에 따라 효과적으로 "사용"하는 것입니다. . GCC는 정적 데이터 멤버가 "사용"되는 것으로 간주하므로 프로그램 범위 내에서 구현을 요구합니다. 그러나 lvalue-rvalue 변환이 즉시 발생하는 값 전달의 경우 관대함을 허용합니다.
또한 존재하지 않는 개체의 주소를 가져오거나 참조하는 것은 일반적으로 권장되지 않습니다. 정적 데이터 멤버는 고유한 메모리 위치에 상주하며 해당 주소를 여러 변환 단위에서 전달하면 개체가 하나의 TU에 명시적으로 정의되지 않는 한 정의되지 않은 동작이 발생할 수 있습니다.
요약하면 다음 요구 사항으로 인해 컴파일러 오류가 발생합니다. const 참조로 전달되거나 상수 표현식에 사용되는 경우 정적 const 정수의 정의입니다. 이러한 오류를 방지하려면 표준 지침을 준수하는 것이 중요합니다.
위 내용은 템플릿 함수에 대한 상수 참조로 정적 상수 정수를 전달하면 \"정의되지 않은 참조\" 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!