首頁  >  文章  >  後端開發  >  文字的reinterpret_cast對於初始化constexpr靜態常數空指標有效嗎?

文字的reinterpret_cast對於初始化constexpr靜態常數空指標有效嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-13 03:32:02731瀏覽

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

constexpr 和使用重新解釋強制轉換靜態常數空指標的初始化:哪個編譯器是正確的?

問題描述

考慮以下程式碼片段:

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 編譯器是正確

依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);

以上是文字的reinterpret_cast對於初始化constexpr靜態常數空指標有效嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn