> 백엔드 개발 > C++ > 참조로 정적 상수 Int를 전달하면 C에서 \'정의되지 않은 참조\' 오류가 발생하는 이유는 무엇입니까?

참조로 정적 상수 Int를 전달하면 C에서 \'정의되지 않은 참조\' 오류가 발생하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-29 19:02:02
원래의
761명이 탐색했습니다.

Why Does Passing a Static Const Int by Reference Cause an

Static Const Int에 대한 정의되지 않은 참조: A 해상도

최근 프로그래밍 시나리오에서 "정의되지 않은 참조에 대한 참조"라는 메시지와 함께 컴파일 오류가 발생했습니다. '바::kConst'". 오류는 다음 코드 조각에서 발생했습니다.

class Bar
{
public:
   static const int kConst = 1;
   void func()
   {
      foo(kConst);           // Error-prone line
   }
};
로그인 후 복사

정적 상수 멤버 "kConst"가 정의되지 않았기 때문에 오류가 발생했습니다. 일반적으로 컴파일러는 컴파일 타임에 필요한 대체 작업을 수행할 것으로 예상됩니다. 그러나 이 경우 "foo" 함수는 "const int &" 매개변수를 사용하므로 컴파일러는 대체보다 참조를 선호하게 됩니다.

문제를 해결하려면 다음 수정 사항을 사용할 수 있습니다.

foo(static_cast<int>(kConst));
로그인 후 복사

이 접근 방식은 컴파일러가 임시 "int"를 생성하고 이에 대한 참조를 전달하도록 하여 성공적인 컴파일을 가능하게 합니다.

관찰된 동작은 C 표준( 9.4.2/4), 이는 상수 정수 유형의 정적 데이터 멤버에 상수 초기화 프로그램이 있는 경우 정수 상수 표현식에 나타날 수 있음을 명시합니다. 그러나 프로그램에서 사용되는 경우에는 여전히 네임스페이스 범위에서 정의되어야 합니다.

주어진 코드에서 정적 데이터 멤버를 상수 참조로 전달하는 것은 C 표준(3.2/2)에 따른 "사용"을 구성합니다. 이는 컴파일러가 "kConst"에 대한 정의의 존재를 강제할 의무가 있음을 의미합니다.

GCC가 때때로 특정 시나리오에서 이 요구 사항을 간과할 수 있지만 일반적으로 표준을 준수하고 참조 사용을 자제하는 것이 좋습니다. 존재하지 않는 개체의 주소를 가져오거나 가져옵니다.

위 내용은 참조로 정적 상수 Int를 전달하면 C에서 \'정의되지 않은 참조\' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿