>백엔드 개발 >C++ >C에서 Constexpr 정적 함수를 사용하여 Constexpr 정적 멤버를 올바르게 초기화하려면 어떻게 해야 합니까?

C에서 Constexpr 정적 함수를 사용하여 Constexpr 정적 멤버를 올바르게 초기화하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-02 13:35:12741검색

How Can I Correctly Initialize a Constexpr Static Member Using a Constexpr Static Function in C  ?

constexpr 정적 함수를 사용하여 정적 멤버 초기화: 연습

소개

제시한 시나리오에는 constexpr 함수. 불행하게도 특정 접근 방식으로 이를 달성하려는 시도는 다양한 gcc 버전에서 문제에 직면했습니다. 이 기사에서는 이러한 시도를 분석하고, 오류의 근본 원인을 탐색하고, 가능한 해결 방법이나 설명을 제공합니다.

첫 번째 시도 및 오류

초기 시도에는 constexpr 함수를 선언하는 작업이 포함되었습니다. 클래스 본문 내의 foo 및 constexpr 정적 멤버 막대로 인해 컴파일 오류가 발생했습니다. 이는 함수 호출이 상수 표현식 내에 존재할 수 없으며 정적 클래스 멤버가 상수가 아닌 이니셜라이저를 가질 수 없음을 나타냅니다.

두 번째 시도 및 오류

두 번째 시도에서는 선언을 클래스 본문 외부로 이동했습니다. , 그러나 이로 인해 여전히 오류가 발생했습니다. 특히 오류 메시지에는 정적 데이터 멤버 bar에 초기화가 있어야 하며 constexpr로 선언하는 것이 클래스 외부의 이전 선언과 모순된다는 내용이 나와 있습니다.

표준 분석

C 표준 섹션 9.4 .2에서는 리터럴 유형의 정적 데이터 멤버가 선언에 constexpr 지정자를 가질 수 있다고 명시합니다. 그러나 해당 초기화 프로그램은 중괄호 초기화 프로그램이어야 하며 그 안의 할당 표현식은 상수 표현식이어야 합니다.

두 시도 모두 bar 선언에 중괄호 또는 같음이 부족했습니다. -초기화 장치. 따라서 둘 다 표준에서 정한 요구 사항을 충족하지 않습니다.

제한 사항 및 해결 방법

그러나 이러한 상황에는 표준에서 부과하는 고유한 제한이 있습니다. 클래스가 완료된 컨텍스트에서 정적 constexpr 데이터 멤버를 초기화하는 것을 허용하지 않습니다. 따라서 중괄호 또는 같음 초기화 규칙을 사용하는 것은 비정적 데이터 멤버에만 적용 가능합니다.

결과적으로 클래스 완성에 의존하는 constexpr 함수를 사용하여 정적 constexpr 데이터 멤버를 초기화하는 것은 불가능해집니다. . 이러한 제한은 멤버 함수의 컨텍스트에서 constexpr 변수를 컴파일 타임 상수 식으로 사용할 수 있어야 한다는 요구 사항으로 인해 발생할 수 있습니다. 따라서 변수 이니셜라이저는 함수 본문보다 먼저 완전히 정의되어야 하지만 정적 데이터 멤버의 이니셜라이저는 이 컨텍스트에서 정의되지 않은 함수 호출로 이어져 상수 표현식 요구 사항을 위반합니다.

위 내용은 C에서 Constexpr 정적 함수를 사용하여 Constexpr 정적 멤버를 올바르게 초기화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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