다음 코드 조각을 고려하세요.
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); }; auto main() -> int { return 0; }
이 코드는 다음과 같습니다. g v4.9에서는 성공했지만 clang v3.4에서는 실패하고 다음 오류가 발생합니다.
error: constexpr variable 'ptr' must be initialized by a constant expression
C 11 표준 섹션 5.19(상수)에 따르면 식), 조건식은 다음과 관련된 경우 핵심 상수 식으로 간주되지 않습니다. reinterpret_cast. 따라서 이 코드를 오류로 표시하는 clang이 정확합니다.
간단한 해결책은 intptr_t를 대신 사용하고 필요한 경우 void*:
static constexpr intptr_t ptr = 0x1; reinterpret_cast<void*>(foo::ptr);
그러나 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);
위 내용은 constexpr Static Const Void 포인터를 초기화하는 데 리터럴의 reinterpret_cast가 유효합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!