>  기사  >  백엔드 개발  >  constexpr Static Const Void 포인터를 초기화하는 데 리터럴의 reinterpret_cast가 유효합니까?

constexpr Static Const Void 포인터를 초기화하는 데 리터럴의 reinterpret_cast가 유효합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-13 03:32:02732검색

Is reinterpret_cast of a Literal Valid for Initializing a constexpr Static Const Void Pointer?

constexpr 및 재해석 캐스트를 사용한 정적 Const Void 포인터 초기화: 어떤 컴파일러가 올바른가요?

문제 설명

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

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

질문

  1. 표준에 따라 어떤 컴파일러가 올바른가요?
  2. 그런 선언을 하는 올바른 방법은 무엇입니까? 표현식?

답변

  1. clang Compiler가 맞습니다

C 11 표준 섹션 5.19(상수)에 따르면 식), 조건식은 다음과 관련된 경우 핵심 상수 식으로 간주되지 않습니다. reinterpret_cast. 따라서 이 코드를 오류로 표시하는 clang이 정확합니다.

  1. 적절한 선언

간단한 해결책은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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