>백엔드 개발 >C++ >C에서 `constexpr` 정적 함수를 사용하여 `constexpr` 정적 멤버를 어떻게 초기화할 수 있습니까?

C에서 `constexpr` 정적 함수를 사용하여 `constexpr` 정적 멤버를 어떻게 초기화할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-09 22:35:11879검색

How Can a `constexpr` Static Member Be Initialized Using a `constexpr` Static Function in C  ?

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

이 코드의 목표는 다음의 네임스페이스에 constexpr 값을 생성하는 것입니다. constexpr 정적 함수와 정적 멤버를 활용하여 클래스를 만듭니다. 그러나 이를 달성하려는 시도에서는 다양한 g 버전에서 컴파일 오류가 발생했습니다.

첫 번째 시도

class C1 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar = foo(sizeof(int));
};

이 코드는 g 4.5.3 및 4.6에서 실패합니다. 3 constexpr 정적 멤버에 함수 호출이 있기 때문입니다.

두 번째 시도

class C2 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar;
};
constexpr int C2::bar = C2::foo(sizeof(int));

정적 constexpr 데이터 멤버의 선언에 초기화 프로그램이 있어야 하기 때문에 이 코드는 g 4.6.3에서 실패합니다.

더 스탠다드의 요구 사항

C 표준의 섹션 9.4.2에 따르면 리터럴 유형의 정적 데이터 멤버는 constexpr 지정자를 사용하여 클래스 정의에서 선언할 수 있습니다. 그렇다면 선언은 중괄호 또는 등호 초기화를 지정해야 하며, 여기서 모든 초기화 절은 상수 표현식입니다.

"두 번째 시도" 코드에서 선언에는 중괄호 또는 등호가 없습니다. 균등 초기화 장치. 따라서 표준 요구 사항을 충족하지 않습니다.

목표 불가능

안타깝게도 표준에서는 클래스가 있는 모든 컨텍스트에서 정적 constexpr 데이터 멤버를 초기화하는 것을 금지합니다. 완벽한. 이는 constexpr 변수가 멤버 함수 본문 내부에서 컴파일 타임 상수 표현식으로 사용 가능해야 하기 때문입니다. 따라서 변수 이니셜라이저는 함수 본문보다 먼저 완전히 정의됩니다. 이는 함수가 이니셜라이저 컨텍스트에서 여전히 불완전하다는 것을 의미합니다. 결과적으로 해당 표현식은 상수 표현식으로 간주되지 않습니다.

결론

C 표준의 제한으로 인해 정적 constexpr 데이터를 초기화할 수 없습니다. 클래스가 완료되면 constexpr 정적 함수를 사용하는 멤버.

위 내용은 C에서 `constexpr` 정적 함수를 사용하여 `constexpr` 정적 멤버를 어떻게 초기화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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