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

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

Linda Hamilton
Linda Hamilton원래의
2024-10-29 19:02:02771검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.