>백엔드 개발 >C++ >`reinterpret_cast`를 사용하여 `consexpr` 정적 const void 포인터를 초기화할 수 있나요?

`reinterpret_cast`를 사용하여 `consexpr` 정적 const void 포인터를 초기화할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-30 03:19:10958검색

Can `reinterpret_cast` be used to initialize a `constexpr` static const void pointer?

constexpr 및 재해석 캐스트를 사용한 정적 const Void 포인터 초기화: 컴파일러 불일치

다음 코드 조각은 문제를 보여줍니다.

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

컴파일러 불일치

이 코드는 g v4.9에서는 성공적으로 컴파일되지만 clang v3.4에서는 컴파일에 실패합니다. Clang에서 오류가 발생합니다.

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

표준 준수

C 11 표준에 따르면 constexpr 변수는 상수 표현식으로 초기화되어야 합니다. Reinterpret_cast는 C 11 표준 초안의 섹션 5.19 단락 2에 명시된 대로 상수 표현식이 아닙니다. 따라서 코드를 거부하는 것은 clang이 맞습니다.

적절한 선언

재해석 형변환으로 constexpr 변수를 선언하는 올바른 방법은 __builtin_constant_p 매크로를 사용하는 것입니다. 이 매크로는 상수가 아닌 표현식의 상수 접기를 허용합니다. 다음 수정 코드는 g와 clang 모두에서 컴파일됩니다.

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

이 코드는 삼항 조건 연산자를 사용하여 재해석 캐스트 표현식이 상수 표현식인지 테스트합니다. true이면 캐스트가 수행되고, 그렇지 않으면 평가가 실패합니다.

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

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