簡體   English   中英

const_cast在常量表達式中是否有效? (C ++ 14,C ++ 17)

[英]Is const_cast valid in a constant expression? (C++14, C++17)

遇到的具體問題是編譯器如何處理它有一些不一致。

例如這段代碼( https://godbolt.org/z/08Z-zi ):

    constexpr auto value = 1;
    static_assert(*const_cast<int *>(&value), "value should be 1");

使用GCC,Clang和MSVC編譯良好,但在英特爾C ++編譯器19.0.1中失敗,並出現以下錯誤:

error: expression must have a constant value
static_assert(*const_cast<int *>(&value), "value should be 1");

據我所知,標准沒有明確聲明const_cast不允許在常量表達式中。 通過結果指針寫入將是未定義的,因此不允許,但讀取應該沒問題。

考慮到所有主要編譯器都編譯此代碼(包括ICC <19.0.1),它可能只是ICC 19.0.1中的回歸。

C ++中常量表達式中可能出現或未出現的內容由表達式的黑名單或表達式屬性定義。 完整列表位於[expr.const]部分,第2段。列表中沒有任何內容禁止const_cast本身。 據我所知,唯一相關的是§2.7

除非適用,否則左值轉換為左值

  • 一個非整數或枚舉類型的非易失性glvalue,它引用一個完整的非易失性const對象,具有前面的初始化,用常量表達式初始化,或者

  • 一個非易失性glvalue,引用字符串文字的子對象,或

  • 非易失性glvalue,引用constexpr定義的非易失性對象,或引用此類對象的不可變子對象,或者

  • 文字類型的非易失性glvalue,指的是一個非易失性對象,其生命周期始於e的評估范圍內;

對於(大致)“讀取對象的存儲值”,左值到右值的轉換是標准的。 這就是你的例子所做的。 現在,這些可能不會出現在常數表達式中。 除了前面的一個子彈適用之外。

第三個子彈適用於您的情況。 *運算符產生左值。 所述左值不是易失性的,並且指的是constexpr對象( value )。 因此,您的代碼是有效的C ++。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM