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