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