>  기사  >  백엔드 개발  >  `reinterpret_cast`를 사용하여 `consexpr` 변수를 초기화할 수 있나요?

`reinterpret_cast`를 사용하여 `consexpr` 변수를 초기화할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-13 07:14:02454검색

Can `reinterpret_cast` be used to initialize a `constexpr` variable?

constexpr reinterpret_cast 및 컴파일러 호환성을 사용한 변수 초기화

다음 코드 조각을 고려하세요.

struct foo {
  static constexpr const void* ptr = reinterpret_cast<const void*>(0x1);
};

다음 코드 조각을 고려하세요. g v4.9에서는 이 코드가 성공적으로 컴파일됩니다. 그러나 clang v3.4는 컴파일에 실패하고 오류가 발생합니다.

error: constexpr variable 'ptr' must be initialized by a constant expression

컴파일러 정확성

C 11 초안 표준에 따라(섹션 5.19, 단락 2) ), 조건식은 reinterpret_cast와 관련된 경우 상수 식으로 간주되지 않습니다. 따라서 ptr의 초기화가 유효하지 않다는 clang의 해석은 정확합니다.

올바른 선언

이러한 특성의 상수 표현식을 올바르게 선언하려면 다음을 사용해야 합니다. 대신 intptr_t를 사용하고 필요한 경우 캐스팅합니다.

static constexpr intptr_t ptr = 0x1;

또는 gcc와 clang 모두에서 지원되는 해결 방법은 문서화되지 않은 __builtin_constant_p 매크로를 사용하는 것입니다.

static constexpr const void* ptr =
  __builtin_constant_p(reinterpret_cast<const void*>(0x1)) ?
    reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);

이 표현식은 두 컴파일러에서 모두 허용됩니다. 표현식이 상수 접히도록 강제하는 __builtin_constant_p 검사에 적용됩니다.

위 내용은 `reinterpret_cast`를 사용하여 `consexpr` 변수를 초기화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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